UICollectionView scrollToItemAtIndexPath在导航控制器中无法正常运行

时间:2014-05-04 16:28:19

标签: ios objective-c

我有一个方法可以滚动到我的collectionView

的底部
- (void) scrollToBottom {
    if (_messagesArray.count > 0) {
        static NSInteger section = 0;
        NSInteger item = [self collectionView:_myCollectionView numberOfItemsInSection:section] - 1;
        if (item < 0) item = 0;
        NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:item inSection:section];
        [_myCollectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:UICollectionViewScrollPositionBottom animated:YES];
    }
}

它完美无缺!我从来没有遇到任何问题,它的工作方式是100%一致的。 。 。用模态视图演示。但是,如果我将viewController推送到导航控制器上,它就无法工作。相反,它只适用于超过15个单元格。一旦我达到至少15个细胞,它再次开始表现完美。在15个单元格之前,它要么根本不滚动,要么滚动一点。

我意识到这是一个很长的镜头,但是我在这个问题上摸不着头脑,我想也许有人可能知道到底发生了什么。

的故障排除:

您是否已登录以确保其正在运行?是

您是否已记录索引路径以确保其尝试滚动到正确的索引路径?是

示例

enter image description here

工作模式示例

enter image description here

5 个答案:

答案 0 :(得分:5)

automaticallyAdjustsScrollViewInsets中有一个UIViewController属性,并且在UINavigationController中继承了该属性。将其设置为NO中的self.navigationController,它不会调整您的插图,如文档here

答案 1 :(得分:2)

我发现了问题。

由于某种原因,NavigationController自动调整了我的顶级内容插入。我可以通过添加以下内容来阻止此行为:

- (void) scrollToBottom {

    if (_isNavigationControllerVersion) {
        _myCollectionView.contentInset = UIEdgeInsetsZero;
    }

    if (_messagesArray.count > 0) {
        static NSInteger section = 0;
        NSInteger item = [self collectionView:_myCollectionView numberOfItemsInSection:section] - 1;
        if (item < 0) item = 0;
        NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:item inSection:section];
        [_myCollectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:UICollectionViewScrollPositionBottom animated:YES];
    }
}

答案 2 :(得分:1)

因此,由于你的.gif文件证明当键盘打开时问题正在发生,我只能假设底部滚动位于集合视图的内容插入内,即使它位于键盘后面。

确保在键盘出现/消失时重置内容插入。我将在一些示例代码中进行编辑。

首先,您需要注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];

这应该放在viewDidLoad中。别忘了removeObserver中的dealloc

现在在这些方法中设置内容插入:

- (void)keyboardWasShown:(NSNotification *)aNotification {
    CGSize kbSize = [[[aNotification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets insets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    yourCollectionView.contentInset = Insets;
    yourCollectionView.scrollIndicatorInsets = Insets;
}

- (void) keyboardWillHide:(NSNotification *)aNotification {
    UIEdgeInsets insets = UIEdgeInsetsZero;
    yourCollectionView.contentInset = contentInsets;
    yourCollectionView.scrollIndicatorInsets = contentInsets;
}

答案 3 :(得分:1)

在我有权访问该单元格的上下文中遇到同样的问题,我能够使用scrollRectToVisible,但似乎没有表现出这种行为。

答案 4 :(得分:0)

我找到了很好的解决方案here

{{1}}