旋转的 UIView 变得无响应

Posted

技术标签:

【中文标题】旋转的 UIView 变得无响应【英文标题】:Rotating UIViews become unresponsive 【发布时间】:2012-07-13 14:52:33 【问题描述】:

我有一个 UIViewController 子类,它会在 UI 旋转时更改其框架(例如,最常见的是,框架大小相同,并且在横向和纵向中都居中。)当视图旋转时,视图在视觉上将其框架更改为预期的。但是最终在新框架区域中的控件(按钮、滚动视图等)不会响应触摸。唯一响应的控件是保留在原始框架中的控件(因此,如果视图向下和向左移动,右上角的控件或控件的一部分保持响应。)知道这里发生了什么吗?

下面是改变框架的代码:

- (void) setLandscape:(bool)bLandscape 

    if( bLandscape )
        [self setFrame:m_landscapeFrame];
    else
        [self setFrame:m_portraitFrame];

在直接处理旋转的更大视图控制器中:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

    bool bToLandscape= UIInterfaceOrientationIsLandscape(toInterfaceOrientation);

    [UIView beginAnimations:NULL context:nil];
    [UIView setAnimationDuration:duration];

    [m_pCurrentWindowViewController setLandscape:bToLandscape];

    // (Some unrelated stuff happens here...)

    [UIView commitAnimations];


对我来说,这似乎是一个错误,或者至少是 Apple 的糟糕设计 - 永远不应该有一个视图在视觉上处于一个位置而在控制方面处于另一个位置的时候。但我只是在寻找解决此问题的方法。

【问题讨论】:

旧控件似乎仍与原始框架相关联。因为您不能直接修改CGRect,所以如果您想更改值,我看不到创建新框架的任何替代方法。我同意这似乎是糟糕的设计。我在UIControl 类参考中四处查看,没有看到任何将控件与新框架相关联的方法。我唯一能想到的是使用自动调整大小功能而不是您的自定义方法 - 如果您的程序可以这样做。 一定要使用 autosizing springs/struts -- 从经验来看,这比尝试自己编写要容易和可靠得多。 【参考方案1】:

我发现的最简单的解决方法是在 willRotateToInterfaceOrientation 中设置动画后更新 didRotateFromInterfaceOrientation 中的框架。

【讨论】:

以上是关于旋转的 UIView 变得无响应的主要内容,如果未能解决你的问题,请参考以下文章

进入主队列后 UI 变得无响应

播放框架变得无响应? (可能是内存问题)

UITableViewCell 变得无响应

iOS UIButton 点击无响应的解决办法

随着时间的推移,使用 java websockets 实时流式传输模拟视频变得无响应

OnTime 不到 1 秒而没有变得无响应