坏UIScrollView自动旋转行为

时间:2012-01-22 04:54:13

标签: iphone user-interface uiscrollview uiimageview uiinterfaceorientation

我的视图控制器具有以下层次结构: View hierarchy

我只是想加载一张照片并能够滚动它并放大它&自动旋转它。一切都很好,除了我有一些不好的自转行为。我已将父UINavigationController设置为允许旋转(通过子类化和覆盖'shouldautororate ..')我现在正在旋转窗口,但滚动/ imageview组合将不会根据需要填充屏幕(在横向上它将是切割宽度为320p)。支柱和弹簧设置正确。尝试摆弄scroll / imageview.autoresizesSubviews = YES - 但它无济于事。

另外,我必须做一些'丑陋'的事情:

CGPoint cntr;// = {self.view.bounds.size.width/2, self.view.bounds.size.height/2};

    if ([self interfaceOrientation] == UIInterfaceOrientationPortrait)
    {
        cntr.x = (self.view.bounds.size.width/2);
        cntr.y = (self.view.bounds.size.height/2);
    }
    else
    {
        cntr.y = (self.view.bounds.size.width/2);
        cntr.x = (self.view.bounds.size.height/2);
    }

    [spinner setCenter:cntr];
    [self.imageView addSubview:spinner];

因为self.view.bounds不会更新以表示新的横向方向大小(始终返回portait尺寸)。必须有更优雅的东西。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

使用NSLog检查您的自动调整标记,如下所示:

NSLog(@"scroll view = %@", self.scrollView); // or whatever the scroll view is named
NSLog(@"scroll view superview autoresizesSubviews = %d", self.scrollView.superview.autoresizesSubviews);

你想看到这样的东西:

scroll view = <UIScrollView: 0xdbdf200; frame = (0 20; 320 460); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0xd35efb0>; contentOffset: {0, 0}>
scroll view superview autoresizesSubviews = 1

如果正确设置了标志,则autoresize将为“W + H”,并且superview应将autoresizesSubviews属性设置为YES(记录为1)。

如果自动调整功能不起作用,我强烈建议弄清楚为什么不行,因为在旋转时手动调整大小只会让你的代码更难维护。

也就是说,系统会向您的视图控制器发送几个与界面轮换相关的消息。有些是在根视图的边界更新之前发送的,有些是在之后发送的。顺序是这样的:

  1. 系统会向您发送shouldAutorotateToInterfaceOrientation:
  2. 系统会向您发送willRotateToInterfaceOrientation:duration:
  3. 系统更改根视图的边界并进行转换以反映新的界面方向。感谢layoutSubviews的自动调整和覆盖,这通常需要布局整个视图层次结构。
  4. 系统会向您发送willAnimateRotationToInterfaceOrientation:duration:
  5. 系统执行动画。
  6. 系统会向您发送didRotateFromInterfaceOrientation:
  7. 因此,如果您需要调整界面轮换的UI布局,可以通过覆盖自定义视图子类上的layoutSubviews来执行此操作,也可以在willAnimateRotationToInterfaceOrientation:duration:中执行此操作之后根视图的界限已更新。

答案 1 :(得分:1)

您不需要这样做,您可以做的是使用自动调整遮罩属性。您可以根据需要设置以下属性的组合 - UIViewAutoresizingFlexibleWidth,UIViewAutoresizingFlexibleHeight,UIViewAutoresizingFlexibleLeftMargin,UIViewAutoresizingFlexibleRightMargin,UIViewAutoresizingFlexibleTopMargin,UIViewAutoresizingFlexibleBottomMargin