我正在构建一个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();
}
}];
}
}
答案 0 :(得分:0)
好的,终于找到了解决方案。我随意地改变了我的视图控制器视图的界限,但这太过于hacky并且最终没有达到我想要的效果。
我最终做的是将我的视图控制器的edgesForExtendedLayout
属性更改为等于UIRectEdgeAll
,这基本上表示视图应该占据整个屏幕,并延伸到顶部条形图上方/下方条形图块下方。
我不得不在我的文本字段中更改自动布局约束,以便它在正确的时间出现在正确的位置,但总的来说,解决方案是将edgesForExtendedLayout
更改为{{1这使得视图占据整个屏幕,因此文本字段现在仍然在超级视图中,即使它向下动画,因此,它仍然可以接收触摸事件。