Ошибка после поворота с использованием iCarousel в качестве прокрутки

я использую библиотеку iCarousel в качестве прокрутки для своего приложения. Цель этой библиотеки — управлять автоматической прокруткой изображений. Изображение устанавливается как граница класса iCarousel (который на самом деле UIView. Он отлично работает при начальной загрузке, но когда я поворачиваю устройство, он выводит странную ошибку. Например, если я прокручиваю от книжной до альбомной, за доли секунды мы можем см. следующее: введите здесь описание изображения

Затем: введите здесь описание изображения

Мы почему-то видим "старые" картинки

Вот как я объявляю основной метод для отображения представлений:

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view {



    NewScrollerItemForIPad *item;



    NewsItemMdl *mdl = self.viewModel.arrNews[index];
    if(mdl){

        /* Check for orientation */
        BOOL _isPortrait;

        if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){
            _isPortrait = NO;
        } else {
            _isPortrait = YES;
        }

        if (self.gotNews){

        if(!item){
            item = [[NewScrollerItemForIPad alloc] initWithFrame:car.bounds andOrientation:_isPortrait]; 
        }
        [item bindViewModel:mdl];
        }
    }
    return item;

}

И метод автоматической прокрутки:

-(void)runMethod{

    if(self.sliderCount== (self.pageControl.numberOfPages-1)){

        NSLog(@"Here we call");
        self.pageControl.currentPage = 0;
        self.sliderCount = 0;

        [car scrollToItemAtIndex:self.sliderCount animated:YES];

    }else{
        NSLog(@"And here we call");
        self.sliderCount++;
        self.pageControl.currentPage ++;
        [car scrollToItemAtIndex:self.sliderCount animated:YES];
    }

}

Как исправить этот баг? Очевидно, я не хочу, чтобы будущее и старое изображение загружались между новым.


person Evgeniy Kleban    schedule 16.03.2016    source источник
comment
Я не уверен, что это функция или ошибка в iCarousel, но я могу сказать вам, что его реализация и поведение очень-очень странные (в основном с ошибками) — то, что мы Чтобы решить проблемы после изменения ориентации, мы каждый раз вызываем метод –reloadData для фактического экземпляра iCarousel.   -  person holex    schedule 16.03.2016
comment
@holex я звонил [car reloadData]; in - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {, но, к сожалению, проблема не исчезает.   -  person Evgeniy Kleban    schedule 16.03.2016
comment
вам не поможет, если вы перезагрузите данные до фактического вращения; вам нужно сделать это после.   -  person holex    schedule 16.03.2016
comment
@holex хорошо, я попробую, спасибо! :)   -  person Evgeniy Kleban    schedule 16.03.2016
comment
@EvgeniyKleban У меня такая же проблема с iCarousel. Когда я запускаю reloadData после поворота экрана, я на секунду вижу старый размер карусели. Выглядит не так красиво. Подскажите, пожалуйста, как вы решили эту проблему? Возможно, вам следует добавить свой ответ на этот вопрос.   -  person Roman Podymov    schedule 02.08.2017


Ответы (1)


Язык: Swift

Перезагрузите карусель следующим образом:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: { _ in
        self.yourCarouselView.reloadData()
    }, completion: nil)
}

Используйте следующий метод делегата, чтобы определить ширину элемента:

func carouselItemWidth(_ carousel: iCarousel) -> CGFloat {
    return yourCarouselView.bounds.width //Whatever the size you want to set
}

А также

yourCarouselView.isPagingEnabled = true
person Rameez    schedule 13.02.2020
comment
Идеально. В моем случае виновником был кадр вместо Bounds yourCarouselView.frame.width для carouselItemWidth:. - person byJeevan; 22.05.2021