Переход UIViewWithView никогда не переходит к другой фотографии

Я пытаюсь сделать слайд-шоу, похожее на анимацию, на домашней странице моего приложения. Изображение появляется в правильном представлении пользовательского интерфейса, но никогда не переходит на другую фотографию.

РЕДАКТИРОВАТЬ: Попытка установить изображение перед переходом:

- (void)viewDidLoad {
    [super viewDidLoad];
    /*set image before transition */
    _slideShow.image = [UIImage imageNamed:@"Slide Show"];
    [self fetchSpecies];
    [self beginSlideShow];

}

- (void) beginSlideShow{
    NSLog(@"Called");
    if([imageUrls_ count] < 1){
        NSLog(@"EMPTY");
        return;
    }
    [UIView transitionWithView:_slideShow duration:0.2 options: UIViewAnimationOptionTransitionCrossDissolve animations:^{
        int index = arc4random() % [imageUrls_ count];
        _slideShow.image = [self getImage:index];
        // Account for the case where some images just aren't there
        while (_slideShow.image == nil) {
            index = arc4random() % [imageUrls_ count];
            _slideShow.image = [self getImage:index];
        }
    } completion:^(BOOL finished) {
        if (finished){
           //logic
        }
    }];
}


- (void) fetchSpecies{
    NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@ "Species"];
    NSError* error = nil;
    NSManagedObjectContext* context = [(LeafletAppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext];
    NSArray* species = [context executeFetchRequest:request error:&error];

    if (!species || error) { // nil is an error

        NSLog(@"error");
        // handle error
    }

    // Get all the image urls and description to use for the random images
    imageUrls_ = [[NSMutableArray arrayWithCapacity:100] retain];
    imageDescs_ = [[NSMutableArray arrayWithCapacity:100] retain];
    NSString *url;
    NSString *name;

    for (Species *s in species) {

        name = [NSString stringWithFormat:@"%@", [s commonNameFirstLast]];

        url = [s.ExampleImageLeaf pathForLocalImageUsingThumbnail:YES];
        if (url) {
            [imageUrls_ addObject:url];
            [imageDescs_ addObject:[NSString stringWithFormat:@"%@", name]];
        }
        url = [s.ExampleImageFlower pathForLocalImageUsingThumbnail:YES];
        if (url) {
            [imageUrls_ addObject:url];
            [imageDescs_ addObject:[NSString stringWithFormat:@"%@", name]];
        }
        url = [s.ExampleImageFruit pathForLocalImageUsingThumbnail:YES];
        if (url) {
            [imageUrls_ addObject:url];
            [imageDescs_ addObject:[NSString stringWithFormat:@"%@", name]];
        }
    }    
}

- (UIImage *) getImage:(NSUInteger)index
{
   // NSLog(@"empty");
    NSString *url = [imageUrls_ objectAtIndex:index];
    return [UIImage imageWithContentsOfFile:url];
}

Я проверил, и imageUrls имеет 660 элементов, так что это не проблема нехватки фотографий. Я был бы очень признателен за любые идеи/предложения, я очень новичок в iOS.


person maddie    schedule 10.08.2017    source источник
comment
попробуйте установить изображение перед переходом! сначала установите изображение, а затем анимируйте изображение!   -  person Teja Nandamuri    schedule 10.08.2017
comment
Я пытаюсь понять - кажется ли разумным код, который я добавил, чтобы попытаться найти ваше решение? Я думаю, что я все еще делаю что-то не так   -  person maddie    schedule 10.08.2017


Ответы (1)


Я взял два изображения для демонстрационных целей и изменил тег представления при смахивании, чтобы изменить изображение на основе значения тега. ImageView переходит от одной фотографии к другой. Ниже приведен код, где slideView является UIImageView.

Свифт3

Внутри метода viewDidLoad:

slideView.image = UIImage(named: "image1")
slideView.tag = 0

В действии Swipe вызывается следующий метод:

func beginSlideShow() {

    UIView.transition(with: slideView, duration: 1.0, options: [.transitionCrossDissolve, .curveEaseOut], animations: { 
        if self.slideView.tag == 1 {
            self.slideView.image = UIImage(named: "image2")
        } else {
            self.slideView.image = UIImage(named: "image1")
        }
    }, completion: { (finished: Bool) in
        if finished {
            NSLog("animation finished")
        }
    })
}

Цель-C

- (void) beginSlideShow {

[UIView transitionWithView:_slideView duration:1.0 options: UIViewAnimationOptionTransitionCrossDissolve animations:^{
        if (_slideView.tag == 1) {
            _slideView.image = [UIImage imageNamed:@"image2"];
        } else {
            _slideView.image = [UIImage imageNamed:@"image1"];
        }
    } completion:^(BOOL finished) {
        if (finished) {
            NSLog(@"animation finished");
        }
    }];
}
person Rahul Kumar    schedule 10.08.2017
comment
это полезно, но мой проект полностью на Objective C - person maddie; 10.08.2017
comment
Как бы я сделал это с массивом из более чем 600 элементов/изображений? - person maddie; 10.08.2017
comment
У вас есть массив изображений, используя генератор случайных чисел, вы получаете конкретное изображение, которое вы уже делаете, и это правильно. Я имею в виду, что transitionWithView работает, если вы устанавливаете изображение внутри блока кода анимации. - person Rahul Kumar; 10.08.2017
comment
Вызовите метод beginSlideShow внутри метода viewDidAppear, после чего вы сможете увидеть переход и сделать длительность перехода 1.0. - person Rahul Kumar; 10.08.2017
comment
Я уже вызываю beginSlideShow внутри viewDidAppear -- я изменил продолжительность на 1.0, но кроме этого я не понимаю, что еще мне нужно сделать по-другому? - person maddie; 10.08.2017
comment
Получаете ли вы изображение при вызове метода getImage:? - person Rahul Kumar; 10.08.2017
comment
Да, я получаю изображение при вызове getImage. Не нужна ли мне какая-нибудь петля? В противном случае beginSlideShow вызывается один раз, устанавливает одно изображение и завершает работу? - person maddie; 10.08.2017
comment
Да, вам нужен цикл, чтобы сделать переход непрерывным, вызовите метод beginSlideShow внутри завершения: ^ (BOOL завершено) закрытие, когда анимация завершена. - person Rahul Kumar; 11.08.2017