我的视图控制器具有以下层次结构:
我只是想加载一张照片并能够滚动它并放大它&自动旋转它。一切都很好,除了我有一些不好的自转行为。我已将父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尺寸)。必须有更优雅的东西。
我在这里做错了什么?
答案 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
)。
如果自动调整功能不起作用,我强烈建议弄清楚为什么不行,因为在旋转时手动调整大小只会让你的代码更难维护。
也就是说,系统会向您的视图控制器发送几个与界面轮换相关的消息。有些是在根视图的边界更新之前发送的,有些是在之后发送的。顺序是这样的:
shouldAutorotateToInterfaceOrientation:
。willRotateToInterfaceOrientation:duration:
。layoutSubviews
的自动调整和覆盖,这通常需要布局整个视图层次结构。willAnimateRotationToInterfaceOrientation:duration:
。didRotateFromInterfaceOrientation:
。因此,如果您需要调整界面轮换的UI布局,可以通过覆盖自定义视图子类上的layoutSubviews
来执行此操作,也可以在willAnimateRotationToInterfaceOrientation:duration:
中执行此操作之后根视图的界限已更新。
答案 1 :(得分:1)
您不需要这样做,您可以做的是使用自动调整遮罩属性。您可以根据需要设置以下属性的组合 - UIViewAutoresizingFlexibleWidth,UIViewAutoresizingFlexibleHeight,UIViewAutoresizingFlexibleLeftMargin,UIViewAutoresizingFlexibleRightMargin,UIViewAutoresizingFlexibleTopMargin,UIViewAutoresizingFlexibleBottomMargin