键盘出现时,UICollectionView contentOffset会发生变化

tha*_*rai 6 objective-c uiscrollview ios contentoffset uicollectionview

我正在尝试PullDown To Search在我的应用中实现功能.为了实现这一点,我刚刚修改了位EGOTableViewPullRefresh ,除了一个问题之外它工作得很好.

问题

当用户打开应用程序后,将出现以下屏幕.最初UICollectionView's contentoffset应该是(0,0) 在此输入图像描述

如果用户拉低集合视图下面的屏幕应该在这一点上出现contentoffsetUICollectionView(0,-60) 在此输入图像描述

用户可以通过在上面的屏幕中输入文本进行搜索.如用户点击我的问题是在这个屏幕一旦出现UITextField输入文字contentoffsetUICollectionView变化(0,-60),以(0,-110)和UI loosks像波纹管屏.我不确定为什么会发生这种变化你能指导我解决这个问题吗?

在此输入图像描述

小智 2

有同样的问题。重写viewWillAppear:以及viewDidLoad:文档中所述的其他方法没有效果,TPKeyboardAvoidingScrollView也没有帮助。在与集合视图斗争了两天多之后,我找到了一个非常糟糕的解决方法。这个想法是在键盘即将出现时锁定向上滚动,这样你的集合视图就不会移动到任何地方,并在键盘结束动画后解锁滚动。为此,您应该子类化UICollectionView以添加锁定滚动的标志,订阅键盘通知并正确设置此标志。

在实施此解决方法之前,我必须警告您,这是一个非常糟糕的主意,您应该在执行此操作之前尝试其他所有方法。尽管如此,这还是有效的...

所以这就是你要做的:

  1. 在 viewController 的 viewWillAppear 中订阅键盘通知:

    - (void)viewWillAppear:(BOOL)animated
    {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWillShow:)
                                                     name:UIKeyboardWillShowNotification
                                                   object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardDidShow:)
                                                     name:UIKeyboardDidShowNotification
                                                   object:nil];
        // you custom code here
    }
    
    Run Code Online (Sandbox Code Playgroud)

您稍后将处理通知

  1. 不要忘记取消订阅通知:

    - (void)viewWillDisappear:(BOOL)animated
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        // your custom code
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 子类 UICollectionView 并添加标志:

    @property (nonatomic, getter=isLocked) BOOL locked;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在集合视图中覆盖 setContentOffset: :

    - (void)setContentOffset:(CGPoint)contentOffset
    {
        if (contentOffset.y < self.contentOffset.y && self.isLocked) // user scrolls up
            contentOffset.y = self.contentOffset.y; // ignore new Y coordinate, so collection view will not scroll up
        [super setContentOffset:contentOffset];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在你的 viewController 中创建键盘处理方法来锁定和解锁滚动:

    - (void)keyboardWillShow:(NSNotification *)aNotification
    {
        [(LockableCollectionView *)self.collectionView setLocked:YES];
    }
    
    - (void)keyboardDidShow:(NSNotification *)aNotification
    {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [(LockableCollectionView *)self.collectionView setLocked:NO];
        });
    }
    
    Run Code Online (Sandbox Code Playgroud)

警告!这里有一些关于如果dispatch_afterkeyboardDidShow: 键盘显示后立即解锁滚动,锁定将被忽略并且集合视图将向上滚动的一些说明。将其包裹起来dispatch_after,在 0.3 秒后运行此代码,效果很好。这可能与运行循环有关,应该在真实设备上测试,而不是在模拟器中测试。