исчезновение изображений с iPhone

#objective-c #xcode

#objective-c #xcode

Вопрос:

то, что я хочу, это показать изображение в режиме просмотра изображений и затемнить изображение через 5 секунд и показать следующее изображение. изображения хранятся в массиве объектов … я смог выполнить успешный переход между изображениями через 5 секунд.я хочу, чтобы первое изображение исчезло через 5 секунд и появилось следующее, это должно произойти в бесконечном цикле … ниже приведен код, и он действительно хорошо работает для нормального перехода между изображениями..то, что я хочу, — это исчезновение изображений…и должны были добавить переход к затуханию в приведенном ниже коде

 - (void)viewDidLoad {

    imgView.animationImages=[NSArray arrayWithObjects:  
                             [UIImage imageNamed:@"lori.png"],
                             [UIImage imageNamed:@"miranda.png"],
                             [UIImage imageNamed:@"taylor.png"],
                             [UIImage imageNamed:@"ingrid.png"],
                             [UIImage imageNamed:@"kasey.png"], 
                             [UIImage imageNamed:@"wreckers.png"], nil];


    imgView.animationDuration=20.0;
    imgView.animationRepeatCount=0;
    [imgView startAnimating];
    [self.view addSubview:imgView];
    [imgView release];



    [super viewDidLoad];
}
  

Ответ №1:

Вы можете использовать повторяющийся NSTimer для вызова специального метода, который непрерывно анимирует свойство image views alpha с 0.0 до 1.0. Вот некоторый код, который я написал, который работает:

 - (void)viewDidLoad {
    imgView.animationImages=[NSArray arrayWithObjects:  
                             [UIImage imageNamed:@"lori.png"],
                             [UIImage imageNamed:@"miranda.png"],
                             [UIImage imageNamed:@"taylor.png"],
                             [UIImage imageNamed:@"ingrid.png"],
                             [UIImage imageNamed:@"kasey.png"], 
                             [UIImage imageNamed:@"wreckers.png"], nil];



    imgView.animationDuration=20.0;
    imgView.animationRepeatCount=0;
    [imgView startAnimating];
    [self.view addSubview:imgView];
    [imgView release];
    //The timers time interval is the imageViews animation duration devided by the number of images in the animationImages array. 20/5 = 4 
    NSTimer *timer = [NSTimer timerWithTimeInterval:4.0 
                                              target:self 
                                            selector:@selector(onTimer) 
                                            userInfo:nil 
                                             repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [timer fire];

    [super viewDidLoad];
}

//It is important that the animation durations within these animation blocks add up to 4 
//(the time interval of the timer). If you change the time interval then the time intervals 
//in these blocks must also be changed to refelect the amount of time an image is displayed. 
//Failing to do this will mean your fading animation will go out of phase with the switching of images.   

-(void)onTimer{
        [UIView animateWithDuration:3.0 animations:^{
            imgView.alpha = 0.0; 
        }];
        [UIView animateWithDuration:1.0 animations:^{
            imgView.alpha = 1.0; 
        }];
    }
  

Если вы хотите, чтобы длительность затухания составляла 5 секунд вместо 4, вам нужно увеличить свойство animationDuration для просмотра изображений до 25, а затем увеличить длительность анимации затухания в двух блоках таким образом, чтобы суммарное время затухания = 5.

Комментарии:

1. обе анимации запустились бы немедленно и одновременно, не так ли? вам лучше использовать animateWithDuration:animations:completion: где вторая анимация запускается по завершении первой анимации. И я устанавливаю длительность анимации так, чтобы она соответствовала длительности изображений, изменяющихся в imageview. Или измените изображения вручную в методе OnTimer, что лучше, если оно все равно анимируется из кода.

2. @saman: я попробовал приведенный выше код, и мне удалось получить эффект затухания. я хочу, чтобы первое изображение исчезло и показало следующее, а второе исчезающее — следующее …. и т.д. то, что я получаю, — это исчезновение первого изображения, внезапный переход второго, а затем второе изображение, исчезающее через определенную миллисекунду, все еще показывающее второе изображение, и внезапный переход третьего … пожалуйста, вы мне поможете

3. Вы имеете в виду, что по мере того, как текущее изображение исчезает, вы хотите, чтобы следующее изображение исчезало? Чтобы изображение не стало белым, оно переходит непосредственно в следующее изображение?

4. да …. то, что я получаю, это то, что первое изображение исчезает .. внезапно появляется следующее изображение.. второе изображение становится белым и показывает третье через 2 миллисекунды

5. Вам нужны два вида изображений, одно поверх другого, чтобы при исчезновении самого верхнего вида изображения отображался вид изображения на слое ниже.

Ответ №2:

@user652878 Это отвечает на ваш вопрос относительно незаметного перехода от одного изображения к следующему:

Создайте следующие свойства в заголовке вашего view controllers:

 UIImageView *imageViewBottom, *imageViewTop;
    NSArray *imageArray; 
  

Затем добавьте этот код в свой файл implimentaion:

 int topIndex = 0, prevTopIndex = 1; 
- (void)viewDidLoad {

    imageViewBottom = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)];
    [self.view addSubview:imageViewBottom]; 

    imageViewTop = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)];
    [self.view addSubview:imageViewTop];

    imageArray = [NSArray arrayWithObjects:  
                  [UIImage imageNamed:@"lori.png"],
                  [UIImage imageNamed:@"miranda.png"],
                  [UIImage imageNamed:@"taylor.png"],
                  [UIImage imageNamed:@"ingrid.png"],
                  [UIImage imageNamed:@"kasey.png"], 
                  [UIImage imageNamed:@"wreckers.png"], nil];


    NSTimer *timer = [NSTimer timerWithTimeInterval:5.0 
                                              target:self 
                                            selector:@selector(onTimer) 
                                            userInfo:nil 
                                             repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [timer fire];

    [super viewDidLoad];
}

-(void)onTimer{
    if(topIndex %2 == 0){
        [UIView animateWithDuration:5.0 animations:^
        {
            imageViewTop.alpha = 0.0;
        }]; 
        imageViewTop.image = [imageArray objectAtIndex:prevTopIndex];
        imageViewBottom.image = [imageArray objectAtIndex:topIndex];
    }else{
        [UIView animateWithDuration:5.0 animations:^
         {
             imageViewTop.alpha = 1.0;
         }];    
        imageViewTop.image = [imageArray objectAtIndex:topIndex];
        imageViewBottom.image = [imageArray objectAtIndex:prevTopIndex];
    }
    prevTopIndex = topIndex; 
    if(topIndex == [imageArray count]-1){
        topIndex = 0; 
    }else{
        topIndex  ; 
    }
}
  

Комментарии:

1. @samanB: чувак, снимаю шляпу .. сработало отлично … но дело в том, что после третьего изображения приложение завершает работу .. надеюсь, ты поможешь мне в этом

2. Не могли бы вы, пожалуйста, вставить стек вызовов и ошибку, которую вы получаете при сбое. Без этого я почти ничего не могу сделать, чтобы помочь вам.

3. samanB: в консоли произошла ошибка или сбой. просто он показывает 3 изображения идеально, а затем завершает работу

4. У вас нет ошибки в консоли? У меня этот код работает нормально, убедитесь, что все имена файлов изображений указаны правильно, если у вас ошибка в строке, это приведет к сбою программы. Проверьте 4-е изображение в массиве, поскольку оно показывает, что первые 3 в порядке.

5. @saman: чувак, давно не виделись … я попробовал приведенный выше код для 3 изображений, приложение вылетает, выдавая ошибку в консоли, что NSInvalidArgumentException-[NSCFString objectAtIndex:]: Нераспознанный селектор отправлен в экземпляр 0x5e .. прошу тебя помочь мне.

Ответ №3:

Вот что сработало у меня, когда я хотел анимировать набор сообщений в виде изображений для пользователя. Независимо от того, сколько у вас изображений, этот код будет вращаться между ними.

 [self.messageBottom = [[UIImageView alloc] initWithFrame:CGRectMake(289, 262, 171, 38)];
[self addSubview:messageBottom];
[messageBottom setAlpha:0.0];
[messageBottom release];

self.messageTop = [[UIImageView alloc] initWithFrame:CGRectMake(289, 262, 171, 38)];
[self addSubview:messageTop];
[messageTop setAlpha:1.0];
[messageTop release];


self.messageImgsArray =[NSArray arrayWithObjects:  
                        [UIImage imageNamed:@"image1.png"],
                        [UIImage imageNamed:@"image2.png"],
                        [UIImage imageNamed:@"image3.png"],
                        [UIImage imageNamed:@"image4.png"],
                        [UIImage imageNamed:@"image5.png"],nil];


topIndex = 0, bottomIndex = 1;     
[messageTop setImage:[messageImgsArray objectAtIndex:topIndex]];

//The timers time interval is the imageViews animation duration devided by the number of images in the animationImages array. 20/5 = 4 
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 
                                         target:self 
                                       selector:@selector(onTimer) 
                                       userInfo:nil 
                                        repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

}


-(void)onTimer{

    [UIView animateWithDuration:1 animations:^{

        //set the image of the image that is not currently visible

        if (messageTop.alpha == 0) {
            [messageTop setImage:[messageImgsArray objectAtIndex:topIndex]];
        }
        if (messageBottom.alpha == 0) {
            [messageBottom setImage:[messageImgsArray objectAtIndex:bottomIndex]];
        }

        //make sure the images rotate
        [messageTop setAlpha:messageTop.alpha == 0 ? 1 : 0];
        [messageBottom setAlpha:messageBottom.alpha == 0 ? 1 : 0];

        //make sure the images play in a loop

        topIndex = topIndex < [messageImgsArray count]-1 ? bottomIndex 1 : 0;
        bottomIndex = bottomIndex < [messageImgsArray count]-1 ? bottomIndex 1 : 0;

    }];
}
  

Комментарии:

1. как я могу остановить это, т. е. 3 раза?