设置为“Aspect Fit”的UIImage
视图会自动动态缩放其图像以适应UIUmageView
的当前范围,同时保持图像的比例。设置为“Aspect Fit”的UIView
似乎对其子视图没有同样的效果。
我尝试通过代码设置父视图,使用下面的代码,并尝试使用自动调整大小掩码的几个变体(我没有使用自动布局)。我是否遗漏了一些明显的东西,或者我是否需要编写一些代码来根据父视图的当前大小计算子视图的正确比例?
[self.view setContentMode:UIViewContentModeScaleAspectFit];
答案 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;
如果你想进一步参考,我认为这是两个很好的问题:
答案 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");
}
}