AnimateWithDuration 禁用 UIView 上的 userInteraction
Posted
技术标签:
【中文标题】AnimateWithDuration 禁用 UIView 上的 userInteraction【英文标题】:AnimateWithDuration disables userInteraction on UIView 【发布时间】:2014-04-05 16:02:53 【问题描述】:我正在我的一个视图之上添加一个子视图,并使用 animateWithDuration 为其设置动画,使其从屏幕底部开始并在屏幕顶部结束。除了 animateWithDuration 完成后,上面的视图没有用户交互并且下面的视图仍然有用户交互,这一切都很好。如果我删除 animateWithDuration,并在其正常位置启动子视图,用户交互也会按照我的预期工作,这就是为什么我认为 animateWithDuration 是问题所在。
这是我的代码:
UIViewController *viewController = [[CCouponDetailViewController alloc] init];
[[viewController view] setBounds:CGRectMake(0, ([UIScreen mainScreen].bounds.size.height * -1), viewController.view.bounds.size.width, viewController.view.bounds.size.height)];
[self addChildViewController:viewController];
[self.view addSubview:viewController.view];
CGRect newFrame = viewController.view.frame;
newFrame.origin.x = 0;
newFrame.origin.y = ([UIScreen mainScreen].bounds.size.height * -1);
[UIView animateWithDuration:1.0
animations:^
viewController.view.frame = newFrame;
completion:^(BOOL finished)
[viewController didMoveToParentViewController:self];
];
我的另一个问题(不是很重要,只是好奇)是在 newFrame 中,我将 y 设置为与最初设置边界时相同的值,但它会移动。我本来希望 newFrame 需要一个“0”的 y 值,但是当我这样做时,什么也没发生。只是想知道为什么会这样。
【问题讨论】:
好的,这实际上是一个非常复杂的解释......但我现在正在努力。只需花一秒钟的时间来正确措辞,以便您理解它...... 【参考方案1】:我实际上会倒退这个......
“我的另一个问题(不是很重要,只是好奇)是在 newFrame 中,我将 y 设置为与最初设置边界时相同的值,但它会移动。我会预计 newFrame 需要 y 值为“0”,但当我这样做时,什么也没发生。只是想知道为什么会这样。”
这实际上是您需要回答的一个非常重要的问题,因为它与您的代码为何无法正常工作有很大关系。您误解了一些非常重要的概念。
首先,UIView
的bounds
完全确定其相对于自身的位置。 frame
确定UIView
在其父视图中的位置。在您的代码中,您最初设置的是视图的 bounds
,而不是 frame
--
[[viewController view] setBounds:CGRectMake(0, ([UIScreen mainScreen].bounds.size.height * -1), viewController.view.bounds.size.width, viewController.view.bounds.size.height)];
-- 所以你根本没有在最初确定视图在其父视图中的位置,只是相对于它自身。
基本上,您最终会得到一个带有 0x0 帧的 CCouponDetailViewController
视图,但是由于您没有指定您希望您的 UIView
剪辑其子视图,因此您的 CCouponDetailViewController
视图的部分不是实际上在他们的视野之上,但可见并悬在UIView
的边界上。它们不可选择的原因是它们实际上不在UIView
内。
因此,要解决此问题,请设置 UIView
的初始 frame 而不是设置 bounds(我已将初始帧编辑为从屏幕就像你想要做的那样。顺便说一下,我不明白你想要做的高度 x -1 的事情......):
[[viewController view] setFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height, viewController.view.bounds.size.width, viewController.view.bounds.size.height)];
其次,您错误地设置了新框架。您不能这样设置 CGRect:
CGRect newFrame = viewController.view.frame;
newFrame.origin.x = 0;
newFrame.origin.y = ([UIScreen mainScreen].bounds.size.height * -1);
相反,使用CGRectMake
设置它(并且,我再次编辑了 y 值,以便视图最终显示在屏幕顶部,就像您尝试做的那样):
CGRect newFrame = CGRectMake(0, 0, viewController.view.frame.width, viewController.view.frame.height);
【讨论】:
以上是关于AnimateWithDuration 禁用 UIView 上的 userInteraction的主要内容,如果未能解决你的问题,请参考以下文章
[UIView animateWithDuration:completion:]被卡主,延迟执行了completion:回调
尝试使用 animateWithDuration 时找不到方法 '+animateWithDuration:delay:options:animations:'
UIView.animateWithDuration 或 UIScrollView.animateWithDuration - 如何在当前状态暂停