当 UIAlertView 存在时,没有动画的方向会给出奇怪的结果

Posted

技术标签:

【中文标题】当 UIAlertView 存在时,没有动画的方向会给出奇怪的结果【英文标题】:Orientation without animation giving weird result when UIAlertView is present 【发布时间】:2013-05-29 06:20:21 【问题描述】:

我在这里遇到了一个奇怪的问题。

由于某种原因,我在视图控制器中使用 [UIView setAnimationsEnabled:NO]; 禁用了动画 但是当出现警报视图并且如果我改变方向时,它会给出奇怪的结果。

附加的屏幕截图是当我将方向更改为横向时。

请注意:我使用的是标准UIAlertView,它是默认覆盖,当警报视图存在且此处不涉及自定义时显示。

根据documentation

If you disable animations, code inside subsequent animation blocks is still executed but no animations actually occur. Thus, any changes you make inside an animation block are reflected immediately instead of being animated.

所以它不应该影响默认叠加层的大小调整。 Is it a restriction in disabling animation !??

我不明白为什么我会变成这样。 任何人都可以帮助解决这个问题。

【问题讨论】:

所以您首先显示UIAlertView,然后旋转设备,对吗?还是在轮换时显示? 我正在显示UIAlertView,然后旋转设备。 这很奇怪,因为据我所知,当显示UIAlertView 时,会自动禁用旋转。 @SergiusGee 不,UIAlertView 存在时不会禁用旋转。我也在正常的情况下检查了这一点。如果我删除 [UIView setAnimationsEnabled:NO]; 一切正常。 您是否在主线程中显示警报视图?如果不在主线程中显示 【参考方案1】:

当您设置[UIView setAnimationsEnabled:NO]; 时,UIAlertView 不会调整其覆盖视图的大小(我认为这是一个错误)。

当警报视图出现在屏幕上时,您可以选择限制方向,如下所示。

在 .h 文件中创建一个BOOL 变量。

BOOL shouldRotate;

viewDidload 中使用YES 对其进行初始化。

并且每当您当时显示警报时,请shouldRotate = NO;

并实现UIAlertView委托如下:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    shouldRotate = YES;

希望能帮到你。

编辑:因为您不希望动画和带有警报视图的旋转

这实际上是一个 hack,但有效,

alert 是在.h 文件中声明的UIAlertView 的对象。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
    if (UIInterfaceOrientationPortrait == UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) 
        UIImageView *imgView = (UIImageView *)[alert.superview.subviews objectAtIndex:0];
        imgView.frame = CGRectMake(0.0, 0.0, 480.0, 320.0);
    
    else
        UIImageView *imgView = (UIImageView *)[alert.superview.subviews objectAtIndex:0];
        imgView.frame = CGRectMake(0.0, 0.0, 320.0, 480.0);
    

【讨论】:

感谢您的回答,我知道这个替代方案,但我需要同时提供,所以我不能使用这个。 实际上 UIAlertView 用变换动画管理它的覆盖视图(根据我对 UIAlertView 的调试),当你禁用 UIView 的动画时,这部分不会被执行并且覆盖视图不会根据需要调整大小. @prasaddevadiga 我已经编辑了我的答案,它应该可以解决你的问题。【参考方案2】:

解决此错误的另一种可能性是在旋转之前以编程方式关闭警报视图,并在旋转完成后显示一个新视图。

这将自动适用于任何独立于屏幕尺寸的 ios 设备。

【讨论】:

【参考方案3】:

这似乎是 iOS6 及以下版本中的错误,已在 iOS7 中修复。

【讨论】:

以上是关于当 UIAlertView 存在时,没有动画的方向会给出奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章

iOS UIAlertView 权限 Alpha 阴影

当屏幕处于横向模式时,UIAlertview 以纵向模式显示

当 UIWebView 没有互联网连接时实现 UIAlertView

ViewController 方向变化没有动画

获取 JSON 失败时的 UIAlertView [重复]

当 UIAlertView 出现时 TTTAttributedLabel 链接字体发生变化