Autolayout:UIImageView无法按设备方向旋转

时间:2015-11-08 18:19:22

标签: ios objective-c uiviewcontroller autolayout screen-orientation

可能有十几个SO问题具有相似的标题,据我所知,我已经纳入了每个人的建议,没有运气。当我将设备从纵向旋转到横向时,我想要更改背景图像。但是,在我尝试过的每个实验中,横向的UIImageView都是纵向大小的。

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

autolayout

我的视图层次结构配置如下:

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中从根本上改变了原点,图像也从未实际移动过。所以我目前的理论是我对视图大小的更改被忽略/过度写入。

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

1 个答案:

答案 0 :(得分:0)

所以,问题原来是传奇中的另一个变量。 UIImageView上也必须有一个约束,每边都是0,“不受限制地限制边距”。显然,当我提前做了那一步时,实际上并没有采取这种做法。

我不得不承认,但我真的不明白这种约束对我有什么影响。它显然使轮换工作,但我不明白为什么。由于这在技术上是我原始问题的答案,如果有人可以解释这种约束如何实现这种情况,我很乐意给出答案。

修改

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

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