【问题标题】:Fixing strange artifact when rotating views旋转视图时修复奇怪的工件
【发布时间】:2012-09-04 21:51:56
【问题描述】:

我有一个 99.9% 纵向的应用程序。然而,有一个屏幕允许横向显示,以便我们的用户在撰写帖子时可以拥有更多空间。当用户决定在横向模式下从我们的编辑屏幕返回到只能以纵向模式显示的上一个屏幕时,我的问题就会发生,我们会切断导航栏:

有没有人以前见过这个问题或者对如何解决这个问题有任何想法?

编辑不确定它是否明显,但发生的情况是可用于绘制 NavigationBar 的区域被截断到与视图处于横向模式时相同的高度,并且黑条是 Portrait NavigationBar 高度和 Landscape NavigationBar 高度之间的差异。

【问题讨论】:

  • 你在哪里处理你的方向变化?纵向和横向布局是否在不同的视图中?
  • 它们是 2 个独立的视图控制器。所附图片中的一个是纵向的,另一个是横向的,用于较大的键盘。
  • 对不起,让我澄清第一个问题:你是用什么方法来处理你的方向变化的?

标签: iphone ios uiviewcontroller screen-rotation


【解决方案1】:

如果您正在使用:

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

那么原始视图(风景)仍然存在。

使用:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

调整您的视图界面。

这都是猜测,因为您需要提供有关您正在做什么的更多信息,这就是造成这种情况的原因。

【讨论】:

    【解决方案2】:

    使用下面的代码在旋转之前转储 self.view 的超级视图和子视图,然后在旋转完成后,然后在旋转回纵向完成后再次转储。其中一个视图与其原始来源不匹配,这将是您的问题视图。原点的变化很可能是由于没有在顶部/左侧启用支柱。

    这种情况发生在我身上很多次,我写了这个 UIView 类别来转储超级和子视图。

    用法:

    [UIView dumpSuperviews:self.view msg:@"Original superviews"];
    [UIView dumpSubviews:self.view msg:@"Original subviews"];
    

    代码:

    #import <QuartzCore/QuartzCore.h>
    
    #import "UIView+Utilities.h"
    
    @interface UIView (Utilities_Private)
    
    + (void)appendView:(UIView *)v toStr:(NSMutableString *)str;
    
    @end
    
    @implementation UIView (Utilities_Private)
    
    + (void)appendView:(UIView *)a toStr:(NSMutableString *)str
    {
        [str appendFormat:@"  %@: frame=%@ bounds=%@ layerFrame=%@ tag=%d userInteraction=%d alpha=%f hidden=%d\n", 
            NSStringFromClass([a class]),
            NSStringFromCGRect(a.frame),
            NSStringFromCGRect(a.bounds),
            NSStringFromCGRect(a.layer.frame),
            a.tag, 
            a.userInteractionEnabled,
            a.alpha,
            a.isHidden
            ];
    }
    
    @end
    
    @implementation UIView (Utilities)
    
    + (void)dumpSuperviews:(UIView *)v msg:(NSString *)msg
    {
        NSMutableString *str = [NSMutableString stringWithCapacity:256];
    
        while(v) {
            [self appendView:v toStr:str];
            v = v.superview;
        }
        [str appendString:@"\n"];
    
        NSLog(@"%@:\n%@", msg, str);
    }
    
    + (void)dumpSubviews:(UIView *)v msg:(NSString *)msg
    {
        NSMutableString *str = [NSMutableString stringWithCapacity:256];
    
        if(v) [self appendView:v toStr:str];
        for(UIView *a in v.subviews) {
            [self appendView:a toStr:str];
        }
        [str appendString:@"\n"];
    
        NSLog(@"%@:\n%@", msg, str);
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      相关资源
      最近更新 更多