iOS UICollectionView 滑动到指定item失败

释放双眼,带上耳机,听听看~!
具体场景:

在进入某控制器后滑动到指定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判断,导致我在由相册->预览会闪一下。

人已赞赏
iOS文章

iOS-UINavigationController笔记

2019-10-16 10:10:43

iOS文章

iOS 常用的正则表达式

2019-10-16 14:44:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索