2013-06-18 5 views
2

У меня есть UIScrollView с включенным пейджингом. Однако я хочу, чтобы этот прокрутка просматривался прямо, когда прошло определенное количество времени. Есть ли простой способ реализовать это или мне нужно использовать таймер и программно прокручивать прокрутку?автоматический UIScrollView с подкачкой

Что-то нравится этот сайт имеет в своем заголовке: http://denederlandsewateren.nl/ [обратите внимание на текст "De Nederlandse Wateren" меняется каждые х секунд]

ответ

1

Нашел на StackOverflow

[scrollView setContentOffset:CGPointMake(x, y) animated:YES]; 

Чтобы сделать слайд-шоу с UIScrollView, вы упорядочить все изображения в режиме прокрутки, настроить повторный таймер, затем -setContentOffset: анимировать: при срабатывании таймера.

14

Вам нужен небольшой метод, чтобы помочь вам перейти к точной страницы, это не реализовано, но это очень просто, давайте предположим, что ваш Scrollview называется myScrollview

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

-(void)scrollToPage:(NSInteger)aPage{ 
    float myPageWidth = [myScrollView frame].size.width; 
    [myScrollView setContentOffset:CGPointMake(aPage*myPageWidth,y) animated:YES]; 
} 

Тогда вам настроить таймер, чтобы вызвать этот метод каждые 5 секунд, например, так:

[[NSTimer scheduledTimerWithTimeInterval:5 
            target:self 
           selector:@selector(scrollPages) 
           userInfo:Nil 
           repeats:YES] fire]; 

Следующий шаг заключается в создании способа, который будет срабатывать с помощью таймера и перехода к следующей странице, я назвал его -(void)scrollPages, он также требует, чтобы у вас есть две глобальные переменные, называемые currentPage и numberOfPages, оба типа NSInteger

-(void)scrollPages{ 
    [self scrollToPage:currentPage%numberOfPages]; 
    currentPage++; 
} 

Если что-то не имеет смысла, дайте мне знать!

+0

Отличный обзор. Один вопрос: в среде ARC нам нужно твердо придерживаться NSTimer, чтобы гарантировать, что он не исчезнет на нас? – cdstamper

+0

Это зависит от того, что вы делаете: 'schuduleTimerWithTimeInterval' добавит его в runloop для вас, что означает, что вы всегда будете получать вызов' scrollPages', если вы добавите 'id sender' в' scrollPages', чтобы стать '- (void) scrollPages: (id) sender;', ваш отправитель будет таймером, который вызвал этот метод, оттуда вы можете просто аннулировать таймер, не беспокоясь о ссылках! Другой способ - просто полностью ссылаться на него в своем классе и недействить его в любом другом месте вашего кода, как вы сказали! –

0

В файле .h создать выходы для Scrollview и пейджинговой

@property (weak, nonatomic) IBOutlet UIScrollView *sliderScrollView; 
@property (weak, nonatomic) IBOutlet UIPageControl *sliderPageControll; 
@property (nonatomic,strong) NSArray *sliderImagesArray; 
@property (nonatomic,strong) NSString *sliderIndexString; 
@property (nonatomic,strong) NSString *currentPageIndexString; 

после этого в файле .m

[self.sliderScrollView setPagingEnabled:YES]; 
[self.sliderScrollView setBounces:NO]; 
[self.sliderScrollView setAlwaysBounceVertical:NO]; 
[self.sliderScrollView setShowsHorizontalScrollIndicator:NO]; 
self.sliderScrollView.alwaysBounceVertical = NO; 
NSArray *imagesArray = self.sliderImagesArray; 
for (int i = 0; i < [imagesArray count]; i++){ 
      CGFloat xOrigin = i * self.imageSliderScrollView.frame.size.width; 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(xOrigin, 0, self.sliderScrollView.frame.size.width, self.sliderScrollView.frame.size.height)]; 
       imageView.userInteractionEnabled = YES; 
    NSString *imgStr = [serviceImgArray objectAtIndex:i]; 
    NSString *bikeStr = [NSString stringWithFormat:@"%@", imgStr]; 
    NSURL *imageURL = [NSURL URLWithString:[bikeStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    [imageView sd_setImageWithURL:imageURL 
         placeholderImage:[UIImage imageNamed:@"profilepic_bg"]]; 
[imageView setContentMode:UIViewContentModeScaleAspectFill]; 
       [self.sliderScrollView addSubview:imageView]; 
} 
// for adding autorotate scrolling 
    [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(autoStartSlide:) userInfo:nil repeats:YES]; 

self.sliderPageControll.numberOfPages = imagesArray.count; 
self.sliderPageControll.currentPage = 0; 
self.currentPageIndexString = [NSString stringWithFormat:@"%ld",(long)0]; 
[self.sliderScrollView setContentSize:CGSizeMake(self.sliderScrollView.frame.size.width * [imagesArray count], self.sliderScrollView.frame.size.height)]; 

if ([self.sliderPageControll respondsToSelector:@selector(setPageIndicatorTintColor:)]) { 
    self.sliderPageControll.currentPageIndicatorTintColor = [UIColor redColor]; 
    self.sliderPageControll.pageIndicatorTintColor = [UIColor whiteColor]; 
} 

CGRect frame = self.sliderScrollView.frame; 
frame.origin.x = frame.size.width * [[NSString stringWithFormat:@"%@",self.sliderIndexString] integerValue]; 
frame.origin.y = 0; 
[self.sliderScrollView scrollRectToVisible:frame animated:NO]; 
self.sliderPageControll.currentPage = [[NSString stringWithFormat:@"%@",self.sliderIndexString] integerValue]; 

после этого осуществить Scrollview метод делегата

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
NSInteger scrollIndex = (NSInteger)(self.sliderScrollView.contentOffset.x/self.sliderScrollView.frame.size.width); 
self.sliderPageControll.currentPage = scrollIndex; 
self.currentPageIndexString = [NSString stringWithFormat:@"%ld",(long)self.sliderPageControll.currentPage]; 
} 

Здесь реализовать свой метод автотрота.

- (void)autoStartSlide:(id)sender { 
if(pagger.numberOfPages > pagger.currentPage+1) { 
    [UIView animateWithDuration:0.5 animations:^{ 
     slider.contentOffset = CGPointMake(slider.contentOffset.x + slider.frame.size.width, 0); 
    } completion:^(BOOL finished) { 

    }]; 
} 
else { 
    slider.contentOffset = CGPointMake(slider.contentOffset.x - slider.frame.size.width, 0); 
    [UIView animateWithDuration:0.5 animations:^{ 
     slider.contentOffset = CGPointMake(slider.contentOffset.x + slider.frame.size.width, 0); 
    } completion:^(BOOL finished) { 
     slider.contentOffset = CGPointMake(0, 0) ; 
    }]; 
} 
} 
Смежные вопросы