2013-04-04 3 views
0

Я хочу реализовать галерею изображений с автоматическим изменением. вот мой код в контроллере. У меня есть uiimageview с именем image. Я хочу связать массив изображения с моим представлением изображения, чтобы он автоматически менялся через несколько секунд. Что мне делать??Изменение массива изображений с помощью NSTimer

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    [self performSelector:@selector(changeImage) withObject:nil afterDelay:2]; 
} 

-(void)changeImage { 
    NSArray *images = [NSArray arrayWithObjects:[UIImage imageNamed:@"animated-fish-1.jpg"], [UIImage imageNamed:@"tumblr_7"], [UIImage imageNamed:@"th_nature_4.jpg"],nil]; 
    image.animationImages = images; 
    // how to let the array of image load and link to the perform selector?? 
    // what should i continue from here? 
} 
+0

вам необходимо передать некоторое изображение. Это хорошая идея сохранить имя изображения в массиве или изменить все изображения на image1.jpg, image2.jpg и т. Д. –

ответ

4
  • Хранить изображения в Ивар

    @interface YourClass : SomeSuperClass 
    
    @property (nonatomic, strong) NSArray *images; 
    
    @end 
    
  • Не запускать таймер в viewDidLoad как вид не будет на экране еще так что нет смысла - переместить его на viewDidAppear:

    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
        self.images = @[ ... ]; // or pass these into the class 
        self.imageView.image = self.images[0]; 
    } 
    
    - (void)viewDidAppear:(BOOL)animated 
    { 
        [super viewDidAppear:animated]; 
    
        [NSTimer scheduledTimerWithTimeInterval:2 
                target:self 
               selector:@selector(changeImage:) 
               userInfo:nil 
                repeats:YES]; 
    } 
    
    -(void)changeImage:(NSTimer *)timer 
    { 
        NSInteger currentIndex = [self.images indexOfObject:self.imageView.image]; 
        NSInteger nextIndex = (currentIndex + 1) % self.images.count; 
    
        self.imageView.image = self.images[nextIndex]; 
    
        // If for any reason you need to cancel the image rotation 
        if ([self shouldCancelImageRotation]) { 
        [timer invalidate]; 
        } 
    } 
    
+0

Hi paul. я попытался использовать ваш код, но есть ошибка. Вы знаете, что это за ошибка? Завершение приложения из-за неперехваченного исключения «NSUnknownKeyException», причина: «[ setValue: forUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодированием для ключевого изображения». – benedict

+0

Проверьте соединения в вашем xib/раскадровке, которые вы, вероятно, сломали в какой-то момент случайно. Нажмите «imageGalleryViewController» в xib/раскадровке, затем нажмите ⌥⌘6, чтобы отобразить инспектор подключений. Теперь найдите соединение «image» и исправьте его или удалите его. –

+0

привет пауль. вы правы, я сломал одно из соединений. Я решил это, но это приводит меня к другой ошибке. Заключительное приложение из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [__ NSCFConstantString _isResizable]: непризнанный селектор, отправленный экземпляру 0x4b18' – benedict

0

Вы должны использовать NSTimer, на пример, вы можете использовать этот метод:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/clm/NSTimer/scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

Этот метод позволяет определить селектор использовать и повторяется каждые Х секунд

1

К анимируйте изображения, используя таймер, попробуйте это

- (void)viewDidLoad 
{ 
     [super viewDidLoad]; 
     [NSTimer scheduledTimerWithTimeInterval:1 
           target:self 
           selector:@selector(animateImages) 
           userInfo:nil 
           repeats:YES]; 
     imageCount = 1; 

} 

    -(void)animateImages 
    { 
     imageCount = imageCount + 1; 
      NSString *imageName = [NSString stringWithFormat:@"image%i.png"]; 
      [theImage setImage:[UIImage imageNamed:imageName]]; 
    } 
+0

привет венки. как вы храните массив изображений в этой nsstring? – benedict

+0

Привет, Бенедикт, Вы не храните изображение в строке. Назовите изображения таким образом image1, image2, image3 и т. Д. Вы меняете только значение счета, которое, в свою очередь, будет устанавливать новое изображение. – iVenky

0

попробуйте как это, принять один глобальный индекс

Название переменной
- (void)viewDidLoad{ 
     [super viewDidLoad]; 
      index=0; 
      NSArray *images = [NSArray arrayWithObjects:[UIImage imageNamed:@"animated-fish-1.jpg"], [UIImage imageNamed:@"tumblr_7"], [UIImage imageNamed:@"th_nature_4.jpg"],nil]; 
imageview.image = [images objectAtIndex:index]; 
      [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changeImage) userInfo:nil repeats:YES]; 
    } 

-(void)changeImage { 
     index++; 
     if(index==[images count]){ 
     index=0; 
    } 
    imageview.image = [images objectAtIndex:index]; 
    } 
+0

Глобальные переменные являются плохими. Глобальные переменные усугубляются короткими именами, которые ничего не значат:/ –

Смежные вопросы