5

随着最近发布的 iOS 9,可能需要对现有代码进行一些更新,以弥补对 Apple API 所做的任何更改。最近似乎他们已经做到了,现在集合视图会在键盘出现时自动调整其内容插入。这对于不手动处理和/或支持多个操作系统版本的人很有用。在我的应用程序中,它引起了一些头痛。我终于想出了一个解决方案,使用 KVO 在系统更改插图时通知我,我做出相应的反应,除了单个边缘情况外,一切正常。

如果我显示键盘,然后尝试通过导致被调用的交互式滑动返回导航堆栈beginAppearanceTransition:animated:,但随后取消它,然后点击键盘一侧以退出第一响应者,系统突然决定它确实如此不想自动更新我的插图,并且我的 KVO 永远不会因为内容插图而被触发,键盘消失了,但内容插图没有减少,导致它看起来也很错误......但是如果我点击文本字段导致键盘再次显示,突然之间它决定再次进行自动更新。

有没有人知道为什么它在取消更新我的插图的交互式转换后忽略了我第一次关闭键盘?

编辑

不得不重新审视这个,因为团队觉得它太脆弱和太老套了,在玩了这个以了解他们如何处理同样的情况之后,他们似乎不必处理来自任何地方的错误调用。所以我继承了 UICollectionView 并覆盖了 setContentInset 函数,只是为了在这里找到有问题的调用

IMG

除了堆栈跟踪在这一点上不是特别有用,有人知道吗?

4

1 回答 1

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,上述功能实质上否定了系统自动进行的更改。

于 2015-10-22T04:16:09.557 回答