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”,但当我这样做时,什么也没发生。只是想知道为什么会这样。”

这实际上是您需要回答的一个非常重要的问题,因为它与您的代码为何无法正常工作有很大关系。您误解了一些非常重要的概念。

首先,UIViewbounds 完全确定其相对于自身的位置。 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 - 如何在当前状态暂停

饿了么ui下拉框禁用

Swift UIView.animateWithDuration [重复]

如何暂停和恢复 UIView.animateWithDuration