帧大小相对于设备和方向

时间:2013-01-02 05:04:55

标签: objective-c ios cocoa-touch uikit

我创建了一个带有三个子视图的分页UIScrollView。它在横向测试iPhone 5(我设计的方向)时效果很好,但只要设备分辨率发生变化就会中断。

无论设备或方向如何,如何使帧缩放到正确的分辨率?

- (void)viewDidLoad {
    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * i;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;
}

- (IBAction)changePage {
    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * self.pageControl.currentPage;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;
    [self.scrollView scrollRectToVisible:frame animated:YES];
    pageControlBeingUsed = YES;
}

1 个答案:

答案 0 :(得分:1)

将滚动视图放在另一个自定义视图中。在自定义视图中,实现layoutSubviews,如下所示。

@interface ViewScalesOneSubview : UIView
@property UIView *scalingSubview;//subview to scale
@end

@implementation ViewScalesOneSubview
-(void) layoutSubviews {
[super layoutSubviews];
CGRect parentBounds = [self bounds];
CGRect childBounds = [scalingSubview bounds];//unscaled
CGFloat scale = parentBounds.width / childBounds.width;
CGAffineTransform transform = CGAffineTransformMakeScale( scale , scale );
//fiddle with x,y translation to position as you like
scalingSubview.transform = transform;
}
@end

让自定义视图自动调整,使其适合窗口或任何容器,并随旋转而变化。不要让滚动视图自动调整,因为它会与此自定义layoutSubviews冲突。当自定义视图更改大小时,它将缩放scalingSubview以适合。通过对两个轴使用相同的比例,它将保留纵横比。您可以缩放以适应,或使用高度而不是宽度等等。

编辑:

要调整视图大小,而不是缩放视图,请设置自动调整遮罩。

scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

https://developer.apple.com/library/ios/documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instp/UIView/autoresizingMask

您也可以在界面构建器中执行此操作。