美文网首页
UICollectionView 滑动到指定item失败

UICollectionView 滑动到指定item失败

作者: ZJ_偶尔上路 | 来源:发表于2017-07-12 16:43 被阅读0次
    具体场景:

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

    相关文章

      网友评论

          本文标题:UICollectionView 滑动到指定item失败

          本文链接:https://www.haomeiwen.com/subject/aevfhxtx.html