iOS SuperView 之外的 UITextField 不响应触摸

iOS UITextField Outside of SuperView not Responding to Touches

我正在构建一个 iOS 8 应用程序,它利用 UINavgitationController 上的新 hidesBarsOnSwipe 属性 在滚动时隐藏导航栏。在隐藏导航栏的同时,我也以编程方式隐藏了标签栏。在选项卡栏的顶部,有一个文本字段,让用户可以在 post 上发表评论(很像 Facebook)。当标签栏被隐藏时(通过向下移动它离开屏幕),文本字段也被向下移动,所以它现在位于屏幕底部并且屏幕底部和屏幕底部之间没有间隙文本字段。

所以,一切看起来都很棒。但是,事实证明文本字段在移动到屏幕底部时不响应触摸事件。我做了一些挖掘,看来原因是因为文本字段在其父视图(视图控制器的视图)之外,因此触摸事件不会发送到文本字段。

所以我想我已经弄清楚为什么会出现这个问题,但我还没有弄清楚如何解决它。我试过弄乱 hitTest:withEvent:pointInside:withEvent: 但没有任何运气。任何人有任何解决方案?

编辑:这里有一些代码可以使问题更清楚(希望如此)。当nav controller的barHideOnSwipeGestureRecognizer被调用时,我是运行下面的代码:

- (void)barHideSwipeGestureActivated:(UIPanGestureRecognizer*)gesture
{
    [self animateTabBarUpOrDown:self.navigationController.navigationBar.frame.origin.y >= 0 completion:nil];
}

上面的方法如下:

- (void)animateTabBarUpOrDown:(BOOL)up completion:(void (^)(void))completionBlock
{
    if(!self.animatingTabBar && self.tabbarIsUp != up)
    {
        self.animatingTabBar = YES;
        //to animate the tabbar up, reset the comments bottom constraint to 0 and set the tab bar frame to it's original place
        //to animate the tabbar down, move its frame down by its height. set comments bottom constraint to the negative value of that height.
        [UIView animateWithDuration:kTabBarAnimationDuration animations:^{
            UITabBar *tabBar = self.tabBarController.tabBar;
            if(up)
            {
                tabBar.frame = CGRectMake(tabBar.frame.origin.x, tabBar.frame.origin.y - tabBar.frame.size.height, tabBar.frame.size.width, tabBar.frame.size.height);
                self.addCommentViewToBottomConstraint.constant = 0.0f;
            }
            else
            {
                tabBar.frame = CGRectMake(tabBar.frame.origin.x, tabBar.frame.origin.y + tabBar.frame.size.height, tabBar.frame.size.width, tabBar.frame.size.height);
                self.addCommentViewToBottomConstraint.constant = -tabBar.frame.size.height;
            }
        } completion:^(BOOL finished) {
            self.tabbarIsUp = up;
            self.animatingTabBar = NO;
            if(completionBlock)
            {
                completionBlock();
            }
        }];
    }
}

好的,终于找到了解决这个问题的方法。我随意地改变了我的视图控制器视图的边界,但这太老套了,最终没有完成我想要的。

我最后做的是将我的视图控制器的 edgesForExtendedLayout 属性 更改为等于 UIRectEdgeAll 这基本上是说视图应该占据整个屏幕,并延伸到上方顶栏/底栏下方。

我不得不通过更改文本字段的自动布局约束进行一些修改,以便它在正确的时间出现在正确的位置,但总的来说,解决方案正在将 edgesForExtendedLayout 更改为 UIRectEdgeAll - 这使得视图占据了整个屏幕,所以文本字段现在仍然在超级视图中,即使它向下动画,因此,允许它仍然接收触摸事件。