随着最近发布的iOS 9,可能需要对现有代码进行一些更新,以补偿对Apple API所做的任何更改。最近似乎他们已经做到了这样,当键盘出现时,集合视图现在会自动调整它的内容插入。这对于手动处理和支持多个OS版本的用户非常有用。在我的应用程序中,它引起了一些头痛。我终于想出了一个使用KVO的解决方案来通知我系统何时更改了插件并且我做出了相应的反应,除了单个边缘情况外,一切正常。
如果我显示键盘,然后尝试通过交互式滑动返回导航堆栈,导致beginAppearanceTransition:animated:
被调用,但随后取消它,然后点击键盘侧面以重新启动第一响应者,系统突然决定它不想自动更新我的插件,我的KVO永远不会被内容插入触发,键盘消失但内容插入没有减少导致它看起来太错了...如果然而,我点击文本字段导致键盘再次显示,突然它决定再次自动更新。
在取消更新我的插图的互动转换后,有没有人知道为什么它忽略了我第一次解雇键盘?
不得不重新审视这个问题,因为团队觉得它太脆弱和笨拙,并且在与this一起玩,以了解他们如何处理相同的案件后,他们似乎不必处理错误从哪里打电话。所以我子类UICollectionView并覆盖setContentInset函数只是为了在这里找到有问题的调用
IMG http://i63.tinypic.com/2hgqr7t.png
除了堆栈跟踪在这一点上没有特别的帮助,有没有人有任何想法?
答案 0 :(得分:1)
由于没有答案似乎即将到来,其他人遇到了这个问题,这里要求的是我目前的解决方案。
因此,在为contentInset
添加观察者后,我有以下功能。
static bool _willSystemUpdateCollectionViewInset = NO;
static bool _willCustomKeyboardViewUpdateCollectionViewInset = NO;
static bool _didCancelDismissInteraction = NO;
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:NSStringFromSelector(@selector(contentInset))])
{
id oldNumber = change[@"old"];
id newNumber = change[@"new"];
if (_willSystemUpdateCollectionViewInset)
{
_willSystemUpdateCollectionViewInset = NO;
UICollectionView *collectionView = (UICollectionView*)object;
UIEdgeInsets insets = collectionView.contentInset;
insets.bottom = [oldNumber UIEdgeInsetsValue].bottom;
[collectionView setContentInset:insets];
}
else if (_willCustomKeyboardViewUpdateCollectionViewInset)
{
_willCustomKeyboardViewUpdateCollectionViewInset = NO;
[self updateScrollViewInsets];
}
if ([newNumber UIEdgeInsetsValue].bottom > [oldNumber UIEdgeInsetsValue].bottom )
[_messageViewController scrollCollectionViewToBottom:NO];
}
else
{
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
}
因此,在显示或隐藏标志_willSystemUpdateCollectionViewInset
的键盘上设置为YES,上述功能基本上否定了系统自动进行的更改。