我啓用了分頁一個UIScrollView。不過,我希望這個滾動視圖在一定的時間過去後向右滾動。有沒有簡單的方法來實現這一點,或者我需要使用計時器和編程滾動scrollview?自動的UIScrollView分頁
事情是這樣的網站在其頭:http://denederlandsewateren.nl/ [注意文本「德荷屬Wateren」改變每個x秒]
我啓用了分頁一個UIScrollView。不過,我希望這個滾動視圖在一定的時間過去後向右滾動。有沒有簡單的方法來實現這一點,或者我需要使用計時器和編程滾動scrollview?自動的UIScrollView分頁
事情是這樣的網站在其頭:http://denederlandsewateren.nl/ [注意文本「德荷屬Wateren」改變每個x秒]
身上找到這個計算器
[scrollView setContentOffset:CGPointMake(x, y) animated:YES];
要使用的UIScrollView做幻燈片,你將所有圖像排列在滾動視圖中,設置一個重複的定時器,然後-setContentOffset:animated:定時器啓動時。
你需要一點點的方法來幫助您滾動到確切的頁面,這沒有實現,但它是非常簡單的,讓我們假設你的滾動視圖被稱爲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++;
}
如果事情沒有意義讓我知道!
在您的.h文件中實現滾動視圖的委託方法
- (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];
}
這裏後,在您的.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];
創建後滾動視圖和分頁
@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;
網點實現你的自動旋轉方法。
- (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) ;
}];
}
}
很好的概述。一個問題:在ARC環境中,我們是否需要強烈堅持NSTimer以確保它不會消失在我們身上? – cdstamper
這取決於你在做什麼,'schuduleTimerWithTimeInterval'將它添加到你一個runloop,這意味着你將永遠得到'scrollPages'一個電話,如果你添加一個'ID sender'爲'scrollPages'成爲' - (void)scrollPages:(id)sender;',您的發件人將是調用此方法的計時器,您可以簡單地使計時器無效而不必擔心引用! 另一種方法是隻強引用它在你的類和無效的任何其他地方在你的代碼,你說的! –