I wrote a class (PagedView) that works just like a UITableView, and combines the concepts of UIPageControl and UIScrollView in a way that is used, for example, on the iPhone home screen.
The concept is basically this: you need to implement PagedViewDelegate to return the number of pages and the view for each page of the PagedView. Reusing views works just like in a UITableView. Use the interface constructor to connect the scrollview and pageControl outputs.
Please let me know if you find this class useful.
.h file:
// // PagedView.h // // Created by Werner Altewischer on 22/10/10. // Copyright 2010 werner-it.com. All rights reserved. // @protocol ReusableObject - (NSString *)reuseIdentifier; - (void)prepareForReuse; @end @class PagedView; @protocol PagedViewDelegate - (NSUInteger)numberOfPagesInPagedView:(PagedView *)view; - (UIView *)pagedView:(PagedView *)view viewForPageAtIndex:(NSUInteger)page; @end @interface PagedView : UIView<UIScrollViewDelegate> { IBOutlet UIScrollView *scrollView; IBOutlet UIPageControl *pageControl; NSMutableDictionary *pageViewDictionary; NSMutableDictionary *reuseViewDictionary; IBOutlet id <PagedViewDelegate> delegate; } @property (nonatomic, assign) IBOutlet id <PagedViewDelegate> delegate; - (UIView<ReusableObject> *)dequeueReusableViewWithIdentifier:(NSString *)identifier; - (void)scrollToPageAtIndex:(NSUInteger)pageIndex animated:(BOOL)animated; - (NSInteger)indexForSelectedPage; - (CGSize)pageSize; - (void)reloadData; @end
.m file:
// // PagedView.m // // Created by Werner Altewischer on 22/10/10. // Copyright 2010 werner-it.com. All rights reserved. // #define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; } @interface PagedView (Private) - (NSUInteger)pageCount; - (UIView *)loadViewForIndex:(NSUInteger)pageIndex; - (void)unloadViewForIndex:(NSUInteger)pageIndex; - (void)loadViewsForVisiblePages:(BOOL)reloadData; - (UIView *)viewForIndex:(NSUInteger)pageIndex; @end @implementation PagedView @synthesize delegate; - (void)dealloc { TT_RELEASE_SAFELY(pageViewDictionary); TT_RELEASE_SAFELY(reuseViewDictionary); TT_RELEASE_SAFELY(scrollView); TT_RELEASE_SAFELY(pageControl); [super dealloc]; } - (CGSize)pageSize { return scrollView.frame.size; } - (void)reloadData { if (!pageViewDictionary) { //First time initialization pageViewDictionary = [NSMutableDictionary new]; reuseViewDictionary = [NSMutableDictionary new]; [pageControl addTarget:self action:@selector(pageChanged:) forControlEvents:UIControlEventValueChanged]; scrollView.delegate = self; scrollView.pagingEnabled = YES; } CGSize size = self.pageSize; NSUInteger numberOfPages = self.pageCount; pageControl.numberOfPages = MAX(1, numberOfPages); [scrollView setContentSize:CGSizeMake(size.width * numberOfPages, size.height)]; pageControl.currentPage = self.indexForSelectedPage; pageControl.hidden = (numberOfPages == 0); [self loadViewsForVisiblePages:YES]; } - (void)layoutSubviews { if (!pageViewDictionary) { [self reloadData]; } } - (void)scrollToPageAtIndex:(NSUInteger)pageIndex animated:(BOOL)animated { if (pageIndex < self.pageCount) { CGSize size = scrollView.frame.size; CGRect rect = CGRectMake(size.width * pageIndex, 0, size.width, size.height); [scrollView scrollRectToVisible:rect animated:animated]; } } - (NSInteger)indexForSelectedPage { CGFloat cx = scrollView.contentOffset.x; NSUInteger index = (NSUInteger)(cx / scrollView.frame.size.width); if (index >= self.pageCount) { index = NSNotFound; } return index; }
Werner Altewischer Oct 25 2018-10-10 11:49
source share