iOS UITextField在SuperView之外没有响应触摸

时间:2015-03-06 03:55:51

标签: ios objective-c uiview uitextfield hittest

我正在构建一个iOS 8应用,该应用利用hidesBarsOnSwipe上的新UINavgitationController属性在滚动时隐藏导航栏。在导航栏隐藏的同时,我还以编程方式隐藏了标签栏。在标签栏的顶部,有一个文本字段,允许用户评论帖子(很像Facebook)。当隐藏标签栏(通过向下移动并离开屏幕)时,文本字段也会向下移动,因此它现在位于屏幕的底部,因此底部之间没有间隙屏幕和文本字段。

所以,事情看起来很棒。但是,事实证明,当文本字段移动到屏幕底部时,它不会响应触摸事件。我做了一些挖掘,看起来原因是因为文本字段超出了它的超级视图(视图控制器的视图),因此触摸事件不会被发送到文本字段。

所以我认为我已经弄明白为什么问题正在发生,但我还没有想出如何解决它。我曾尝试弄乱hitTest:withEvent:pointInside:withEvent:,但没有运气。有人有任何解决方案?

编辑:这里有一些代码可以让问题更加清晰(希望如此)。当调用导航控制器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();
            }
        }];
    }
}

1 个答案:

答案 0 :(得分:0)

好的,终于找到了解决方案。我随意地改变了我的视图控制器视图的界限,但这太过于hacky并且最终没有达到我想要的效果。

我最终做的是将我的视图控制器的edgesForExtendedLayout属性更改为等于UIRectEdgeAll,这基本上表示视图应该占据整个屏幕,并延伸到顶部条形图上方/下方条形图块下方。

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