ios - 自动布局:UIImageView 不随设备方向旋转

标签 ios objective-c uiviewcontroller autolayout screen-orientation

可能有十几个标题相似的 SO 问题,据我所知,我已经采纳了他们每个人的建议,但没有成功。当我将设备从纵向旋转到横向时,我想更改背景图像。然而,在我尝试过的每个实验中,横向的 UIImageView 都保持纵向大小。

我正在使用 Autolayout,在 IB 中配置如下:

autolayout

我的 View 层次结构是这样配置的:

enter image description here

当我旋转设备时,我想旋转 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 中,但没有任何区别。图像实际上从未移动过,即使我从根本上改变了 newRect 中的原点。所以我目前的理论是我对 View 大小的更改被忽略/覆盖。

问题:我错过了什么阻止将图像大小调整为横向模式?是否还有其他一些我没有解决的自动调整大小方面的问题?

最佳答案

因此,问题原来是传奇中的另一个变数。 UIImageView 也必须有一个约束,每边都为 0,并且“Constrain to Margins unchecked”。显然,当我早些时候执行该步骤时,它实际上并没有采取。

不过,我不得不承认,我真的不明白这个限制对我有什么用。它显然使轮换工作,但我不明白为什么。由于这在技术上是我最初问题的答案,如果有人可以解释此约束如何实现此场景,我将很乐意给出答案。

编辑:

以防将来有人偶然发现这个答案......我现在看到,在 UIImageView 和 UIView 之间设置所有缓冲区为 0 的上述约束将 UIImageView 的边缘固定到 UIView 的边缘。当设备旋转时,viewController 会调整 UIView 的大小,并且在这个约束下,UIImageView 也会调整大小。我能够删除我的大部分代码。我需要的唯一代码是选择纵向或横向图像,我能够删除调整 UIView 和 UIImageView 大小的所有内容。

图像现在可以在仅使用一个约束条件旋转时正确改变大小。我只需要代码来决定是显示横向还是纵向背景。 (我通过将图像存储在 Assets 目录中极大地简化了该代码,因此代码仅选择“肖像”或“风景”的名称,但图像的大小是根据设备自动选择的)。

关于ios - 自动布局:UIImageView 不随设备方向旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33597363/

相关文章:

objective-c - 有没有检查 UIViewController 是否出现的好方法?

ios - ViewController 正在加载一个不存在的 Nib

objective-c - 对于 xCode 中的 XMLparser,我要测试什么字符串名称?

ios - 如何在 Swift 中查找方法可能抛出的错误类型并捕获它们

ios - 用户移动时更新折线

objective-c - 在 Objective-C 中将 Alpha-Beta 修剪添加到 minMax

ios - 用实际代码替换Xcode中定义的代码

iphone - 同一商场中两家商店之间的最短路径绘制

objective-c - 何时在 objective-c 中使用关联对象

ios - 从左到右的过渡屏幕?