我有一个方法可以滚动到我的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个单元格之前,它要么根本不滚动,要么滚动一点。
我意识到这是一个很长的镜头,但是我在这个问题上摸不着头脑,我想也许有人可能知道到底发生了什么。
的故障排除:
您是否已登录以确保其正在运行?是
您是否已记录索引路径以确保其尝试滚动到正确的索引路径?是
答案 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}}