当呼叫状态栏可见时,UIButtons的触碰区域会发生变化。

3

更新2

我的怀疑是正确的。问题出在动画上,因为我没有考虑到当呼叫状态栏可见时,Y轴的原点是不同的。我将添加一个答案,展示相关代码。

更新1

我认为菜单的动画导致了问题。当我按下菜单时,它会开始一个动画来显示菜单。动画会将显示的视图控制器向右滑动,稍微缩小并沿z轴旋转以使其看起来更平滑和酷炫。我将朝这个方向进行调查,并且如果发现任何问题就会更新。

原帖

我注意到我的应用程序在In-Call状态栏可见时存在一些UI问题。

我有一个自定义视图作为我的导航栏,其中包含一个小按钮返回菜单(我将其称为menuBtn)。在这个自定义导航栏下面,我有一个包含两个按钮以在表格中的日期之间导航的tableViewHeader的表视图(我将这些按钮称为:prevBtnnextBtn)。我将使用这3个视图作为示例,但问题会发生在所有地方...

通常情况下,一切都正常,并且按预期工作。即使在In-Call状态栏变为可见时,调整大小也很完美,生活很棒。问题在我点击menuBtn时开始,因此当前视图滑动以显示主菜单(这样我就可以在Storyboards之间切换)。现在,当我回到原始屏幕时,所有视图似乎都没问题(大小方面),但是现在的点击区域与按钮的图像不匹配:我可以看到按钮在应该在的位置,但是当我点击它时没有反应。奇怪的部分是,我可以在下面点击,它会触发绑定到那些按钮的操作。

更加奇怪的是 - 当问题发生时,我可以看到特定按钮(例如:menuBtn)的点击区域重叠了一个不同的按钮(prevBtn)。

已经搜索了一段时间寻找原因/解决方案。我阅读了以下帖子,但没有运气:

  1. ClipToBounds 父视图
  2. AutoResizingMasks中玩耍

我有一种直觉,它与我正在切换Storyboards有关 - 尽管在界面构建器中尝试设置自动调整大小并没有做好这项工作。

以下是可能有助于想要提供帮助的人的一些代码

当按下menuBtn时触发的方法:

- (void)replaceChildStoryboard:(NSString *)storyboardName
{
//remove previos child's view and itself from parent
[currNav removeFromParentViewController];
[currNav.view removeFromSuperview];

//instantiate new storyboard
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
UINavigationController *vc = [storyboard instantiateInitialViewController];

//update curr pointer to new child and add it to parent
currNav = vc;
[self addChildViewController:currNav];
[self.view addSubview:currNav.view];
[currNav didMoveToParentViewController:self];

//animate transition
[self slideNavAnimated:NO];
[self navPressed];

}

一些截图

在第三张截图中,当我点击prevBtn(位于menuBtn下方)时,会触发menuBtn的动作。(如我所画的圆形所示-点击红色圆圈内的区域应该触发prevBtn,但实际上激活了menuBtn。点击黑色圆圈内的区域不应该有任何反应,但激活了prevBtn

正常状态 通话状态栏已打开 点击区域错误

希望能有人帮助我找到问题并修复它。

提前感谢。

1个回答

0

正如我在问题的第二次更新中提到的那样,问题似乎出现在菜单的动画中。最初,我没有考虑到通话状态栏的状态(可见\不可见)会影响视图在y轴上的原点位置。

通过将Y轴的原点添加到动画计算中,我解决了这个问题。 所以每个看起来像这样的调用:

 //adding the animations
      [currNav.view.layer addAnimation:[NRAnimationFactory positionAnimationFrom:CGPointMake(centerOriginX, self.view.frameHeight/2)
                                                                              To:CGPointMake(self.view.frameWidth, self.view.frameHeight/2)
                                                                        Duration:duration]
                                forKey:@"moving"];   

我把它转换成

 //adding the animations :
      [currNav.view.layer addAnimation:[NRAnimationFactory positionAnimationFrom:CGPointMake(centerOriginX, self.view.originY + self.view.frameHeight/2)
                                                                              To:CGPointMake(self.view.frameWidth, self.view.originY + self.view.frameHeight/2)
                                                                        Duration:duration]
                                forKey:@"moving"];   

请注意额外的self.view.originY,当呼叫状态栏不可见时,它等于0,否则为20。
希望这能帮助任何人。我在这上面浪费了几天时间!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接