具体场景:
在进入某控制器后滑动到指定item,我是这样操作的:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.automaticallyAdjustsScrollViewInsets = NO;
//在这个方法里面初始化 UICollectionView(代理方法也已实现)
[self setupSubviewsContraints];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
if (_currentIndex) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_currentIndex inSection:0];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}
}
UICollectionView 滑动到指定item 失败原因分析:
UICollectionView 代理方法还没有执行完成就执行如下,滑动到某指定item代码:
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
所以在执行这个操作前一定要确定代理方法是否已经执行。
衍生疑惑:
UICollectionView 代理方法在什么时候开始执行
解决方法:
想了很久,没有什么好的解决办法,很多情况下进入这个界面会闪一下。
最终只发现一种相对比较流畅的解决方案:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (_currentIndex) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_currentIndex inSection:0];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
}
});
}
真的是投机取巧,可这是目前想到的比较好的一个解决办法。
当然还有一种方法,看起来还不错:
_collectionView.contentSize = CGSizeMake(self.models.count * (self.view.frame.size.width + 20), 0);
if (_currentIndex) [_collectionView setContentOffset:CGPointMake((self.view.tz_width + 20) * _currentIndex, 0) animated:NO];
目前就只有这两种方法。
这个问题是在做查看相册->预览时候发现的。
另:
在获取图片资源asset时会遇到[[info objectForKey:PHImageResultIsDegradedKey] boolValue] Bool值
PHImageRequestID imageRequestID = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
}
这个回调会走两次,Bool = Yes 是低质量图片,Bool = NO则为高质量图片
当我只想要高质量图片时,用了if判断,导致我在由相册->预览会闪一下。