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

Posted

技术标签:

【中文标题】在方向更改时自动缩放 UIView 以按比例缩放以适合父视图【英文标题】:Scale a UIView automatically on orientation change to scale proportionaltely to fit in parent view 【发布时间】:2013-01-01 13:25:27 【问题描述】:

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

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

[self.view setContentMode:UIViewContentModeScaleAspectFit];

【问题讨论】:

【参考方案1】:

来自文档:

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

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

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

【讨论】:

是的,谢谢,我想我必须手动完成。似乎不是什么大事,但它也有点复杂,因为我已经研究了一段时间。我只是想确保我没有错过可以提供帮助的方法或其他类。【参考方案2】: 内容模式不会影响视图的子视图。 您可以使用自动调整大小的蒙版来确定子视图的大小 布局。 如果这还不够,您可能需要实施 layoutSubviews

引用自:https://***.com/a/14111480/1374512

layoutSubviews 上的其他有用信息:https://***.com/a/5330162/1374512

【讨论】:

【参考方案3】:

这个怎么样:

 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

【讨论】:

非常感谢!但是通过尝试这些,似乎这些选项都没有缩放子视图以适应父视图的边界,同时保持子视图的比例。【参考方案4】:

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

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");
    


【讨论】:

以上是关于在方向更改时自动缩放 UIView 以按比例缩放以适合父视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改用户设置的缩放比例的情况下更新地图标记?

如何按比例缩放UIImageView

仅在三个方向上缩放滚动视图

系统缩放比例多少合适

自动布局 - 如何分配内容以按比例填充屏幕[重复]

如何更改CAD中鼠标中键滚动时的缩放比例