自动布局:UIImageView 不随设备方向旋转
Autolayout: UIImageView not rotating with device orientation
可能有十几个标题相似的 SO 问题,据我所知,我已经采纳了他们每个人的建议,但没有成功。当我将设备从纵向旋转到横向时,我想更改背景图像。但是,在我尝试过的每个实验中,横向的 UIImageView 都保持纵向大小。
我正在使用 Autolayout,在 IB 中配置如下:
我的视图层次结构是这样配置的:
当我旋转设备时,我想旋转 UIView viewBackground
中的所有内容(图像和所有按钮)。我相信我可以通过约束来管理按钮移动,但需要自己旋转 UIImageView image view background
。所以,我添加了以下代码:
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
int scaleFactor = self.traitCollection.displayScale;
NSString *source = @"drawn";
NSString *orientation;
if (size.width > size.height)
{
orientation = @"Landscape";
}
else
{
orientation = @"Portrait";
}
NSString *platform;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
platform = @"iPad";
}
else
{
platform = @"iPhone";
}
NSString *filename = [NSString stringWithFormat:@"%@ %@ %@ %.0fx%.0f.png", source, platform, orientation, size.width * scaleFactor, size.height * scaleFactor];
// CONFIRMED: we have assembled the correct new image name.
viewBackground.frame = CGRectMake(0, 0, size.width * scaleFactor, size.height * scaleFactor);
viewBackground.autoresizesSubviews = YES;
viewBackground.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
imageViewBackground.autoresizesSubviews = YES;
imageViewBackground.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
imageViewBackground.image = [UIImage imageNamed:filename];
}
问题: 正确的图像出现在屏幕上,但如上所述,它仍然具有纵向尺寸。我确信图像会随着艺术品的显着不同而发生变化,元素水平堆叠而不是垂直堆叠。但是新图片在横向模式下被水平切掉了。
我试过将各种乱七八糟的值放入 newRect
中,其中 none 产生了任何影响。图像实际上从未移动过,即使我从根本上改变了 newRect
中的原点。所以我目前的理论是,我对视图大小的更改正在 ignored/over 写入。
问题:我错过了什么阻止将图像大小调整为横向模式?还有其他一些我没有解决的自动调整大小问题吗?
所以,问题原来是传奇中的另一个变数。 UIImageView 也必须有一个约束,即每一边都为 0,"Constrain to Margins unchecked." 显然,当我早些时候执行该步骤时,它实际上并没有采取。
不过,我不得不承认,我真的不明白那个约束对我有什么用。它显然使轮换工作,但我不明白为什么。由于这在技术上是我最初问题的答案,如果有人能解释这个约束如何实现这种情况,我会很乐意给出答案。
编辑:
以防将来有人偶然发现这个答案...我现在看到,在 UIImageView 和 UIView 之间设置所有缓冲区为 0 的上述约束将 UIImageView 的边缘固定到 UIView 的边缘。当设备旋转时,viewController 会调整 UIView 的大小,并且在这个约束下,UIImageView 也会调整大小。我能够删除我的大部分代码。我需要的唯一代码是 select 肖像或风景图像,我能够删除调整 UIView 和 UIImageView 大小的所有内容。
图像现在可以在仅使用一个约束旋转时正确改变大小。我只需要代码来决定是显示风景还是肖像背景。 (我通过将图像存储在资产目录中极大地简化了该代码,因此代码只是 selects "portrait" 或 "landscape" 的名称,但图像的大小是自动 select根据设备编辑)。
可能有十几个标题相似的 SO 问题,据我所知,我已经采纳了他们每个人的建议,但没有成功。当我将设备从纵向旋转到横向时,我想更改背景图像。但是,在我尝试过的每个实验中,横向的 UIImageView 都保持纵向大小。
我正在使用 Autolayout,在 IB 中配置如下:
我的视图层次结构是这样配置的:
当我旋转设备时,我想旋转 UIView viewBackground
中的所有内容(图像和所有按钮)。我相信我可以通过约束来管理按钮移动,但需要自己旋转 UIImageView image view background
。所以,我添加了以下代码:
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
int scaleFactor = self.traitCollection.displayScale;
NSString *source = @"drawn";
NSString *orientation;
if (size.width > size.height)
{
orientation = @"Landscape";
}
else
{
orientation = @"Portrait";
}
NSString *platform;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
platform = @"iPad";
}
else
{
platform = @"iPhone";
}
NSString *filename = [NSString stringWithFormat:@"%@ %@ %@ %.0fx%.0f.png", source, platform, orientation, size.width * scaleFactor, size.height * scaleFactor];
// CONFIRMED: we have assembled the correct new image name.
viewBackground.frame = CGRectMake(0, 0, size.width * scaleFactor, size.height * scaleFactor);
viewBackground.autoresizesSubviews = YES;
viewBackground.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
imageViewBackground.autoresizesSubviews = YES;
imageViewBackground.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
imageViewBackground.image = [UIImage imageNamed:filename];
}
问题: 正确的图像出现在屏幕上,但如上所述,它仍然具有纵向尺寸。我确信图像会随着艺术品的显着不同而发生变化,元素水平堆叠而不是垂直堆叠。但是新图片在横向模式下被水平切掉了。
我试过将各种乱七八糟的值放入 newRect
中,其中 none 产生了任何影响。图像实际上从未移动过,即使我从根本上改变了 newRect
中的原点。所以我目前的理论是,我对视图大小的更改正在 ignored/over 写入。
问题:我错过了什么阻止将图像大小调整为横向模式?还有其他一些我没有解决的自动调整大小问题吗?
所以,问题原来是传奇中的另一个变数。 UIImageView 也必须有一个约束,即每一边都为 0,"Constrain to Margins unchecked." 显然,当我早些时候执行该步骤时,它实际上并没有采取。
不过,我不得不承认,我真的不明白那个约束对我有什么用。它显然使轮换工作,但我不明白为什么。由于这在技术上是我最初问题的答案,如果有人能解释这个约束如何实现这种情况,我会很乐意给出答案。
编辑:
以防将来有人偶然发现这个答案...我现在看到,在 UIImageView 和 UIView 之间设置所有缓冲区为 0 的上述约束将 UIImageView 的边缘固定到 UIView 的边缘。当设备旋转时,viewController 会调整 UIView 的大小,并且在这个约束下,UIImageView 也会调整大小。我能够删除我的大部分代码。我需要的唯一代码是 select 肖像或风景图像,我能够删除调整 UIView 和 UIImageView 大小的所有内容。
图像现在可以在仅使用一个约束旋转时正确改变大小。我只需要代码来决定是显示风景还是肖像背景。 (我通过将图像存储在资产目录中极大地简化了该代码,因此代码只是 selects "portrait" 或 "landscape" 的名称,但图像的大小是自动 select根据设备编辑)。