UIRefreshControl与iOS7中的UICollectionView
在我的应用程序中,我使用集合视图的刷新控制。
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds]; collectionView.alwaysBounceVertical = YES; ... [self.view addSubview:collectionView]; UIRefreshControl *refreshControl = [UIRefreshControl new]; [collectionView addSubview:refreshControl];
iOS7有一些令人讨厌的错误,当你拉取集合视图,并且在刷新开始时不松开你的手指时,垂直contentOffset
向下移动20-30点,导致难看的滚动跳跃。
如果你在UITableViewController
之外使用刷新控制,表格也有这个问题。 但对于他们来说,可以通过将UIRefreshControl
实例分配给UITableView
的私有属性_refreshControl
来轻松解决:
@interface UITableView () - (void)_setRefreshControl:(UIRefreshControl *)refreshControl; @end ... UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds]; [self.view addSubview:tableView]; UIRefreshControl *refreshControl = [UIRefreshControl new]; [tableView addSubview:refreshControl]; [tableView _setRefreshControl:refreshControl];
但是UICollectionView
没有这样的属性,所以必须有一些手动处理它的方法。
遇到同样的问题,find了解决方法。
这似乎正在发生,因为当你拖过滚动视图的边缘时, UIScrollView
正在减慢对平移手势的跟踪。 但是,在跟踪期间, UIScrollView
不会logging对contentInset的更改。 UIRefreshControl
在激活时更改contentInset,并且此更改导致跳转。
覆盖你的UICollectionView
setContentInset
和会计这种情况似乎有所帮助:
- (void)setContentInset:(UIEdgeInsets)contentInset { if (self.tracking) { CGFloat diff = contentInset.top - self.contentInset.top; CGPoint translation = [self.panGestureRecognizer translationInView:self]; translation.y -= diff * 3.0 / 2.0; [self.panGestureRecognizer setTranslation:translation inView:self]; } [super setContentInset:contentInset]; }
有趣的是, UITableView
通过不减速跟踪来解决这个问题,直到你拉过刷新控制。 但是,我没有看到这种行为暴露的方式。
- (void)viewDidLoad { [super viewDidLoad]; self.refreshControl = [[UIRefreshControl alloc] init]; [self.refreshControl addTarget:self action:@selector(scrollRefresh:) forControlEvents:UIControlEventValueChanged]; [self.collection insertSubview:self.refreshControl atIndex:0]; self.refreshControl.layer.zPosition = -1; self.collection.alwaysBounceVertical = YES; } - (void)scrollRefresh:(UIRefreshControl *)refreshControl { self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refresh now"]; // ... update datasource dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"Updated %@", [NSDate date]]]; [self.refreshControl endRefreshing]; [self.collection reloadData]; }); }