在方向更改时自动缩放UIView以按比例缩放以适合父视图

时间:2013-01-01 13:25:28

标签: ios uiview autoresizingmask

设置为“Aspect Fit”的UIImage视图会自动动态缩放其图像以适应UIUmageView的当前范围,同时保持图像的比例。设置为“Aspect Fit”的UIView似乎对其子视图没有同样的效果。

我尝试通过代码设置父视图,使用下面的代码,并尝试使用自动调整大小掩码的几个变体(我没有使用自动布局)。我是否遗漏了一些明显的东西,或者我是否需要编写一些代码来根据父视图的当前大小计算子视图的正确比例?

[self.view setContentMode:UIViewContentModeScaleAspectFit];

4 个答案:

答案 0 :(得分:6)

来自文档:

  

内容模式指定在视图边界发生变化时如何调整视图图层的缓存位图。

对于图像视图,这是在谈论图像。对于绘制其内容的视图,这是在讨论绘制的内容。 会影响子视图的布局。

您需要查看子视图上的自动调整大小的掩码。内容模式是这里的红鲱鱼。如果使用自动调整遮罩无法实现布局,则需要实现layoutSubviews并手动计算子视图位置和帧。

答案 1 :(得分:2)

  • 内容模式不会影响视图的子视图。
  • 您可以使用自动调整大小的蒙版来确定子视图的方式 布局。
  • 如果这还不够,您可能想要实施 layoutSubviews

参考:https://stackoverflow.com/a/14111480/1374512

关于layoutSubviews的其他有用信息:https://stackoverflow.com/a/5330162/1374512

答案 2 :(得分:1)

这个怎么样:

 self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

或者你可以试试这个:

// horizontal 
   childView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin |  UIViewAutoresizingFlexibleRightMargin;

// vertical 
   childView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;

// both 
   childView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;

如果你想进一步参考,我认为这是两个很好的问题:

1)Autoresizing masks programmatically

2)UIView and AutoresizingMask ignored

答案 3 :(得分:0)

我一直在玩它。这是不完整的,只处理纵向子视图缩放,但到目前为止工作正常。

if (self.view.bounds.size.width < self.view.bounds.size.height) {
    NSLog(@"view is portrait");
    if (_sview.frame.size.width < _sview.frame.size.height) {
        NSLog(@"subview is portrait");
        [UIView animateWithDuration:0.1
                         animations:^{
                             _sview.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.0, 1.0);
                         }];
    } else {
        NSLog(@"subview is landscape");
    }
} else {
    NSLog(@"landscape");
    if (_sview.frame.size.width < _sview.frame.size.height) {
        [UIView animateWithDuration:0.1
                         animations:^{
                             _sview.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.65, 0.65);
                         }];
    } else {
        NSLog(@"subview is landscape");
    }

}