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

Ios 自动布局:UIImageView不随设备方向旋转,ios,objective-c,uiviewcontroller,autolayout,screen-orientation,Ios,Objective C,Uiviewcontroller,Autolayout,Screen Orientation,可能有十几个类似题目的问题,据我所知,我已经采纳了每一个问题的建议,但运气不好。当我将设备从纵向旋转到横向时,我想更改背景图像。然而,在我尝试的每一个实验中,景观中的UIImageView仍然是肖像大小 我使用的是自动布局,在IB中配置如下: 我的视图层次结构的配置如下: 旋转设备时,我希望旋转UIViewviewBackground中的所有内容(图像和所有按钮)。我相信我可以通过约束来管理按钮的移动,但需要自己旋转UIImageView图像视图背景。因此,我添加了以下代码: -(void)

可能有十几个类似题目的问题,据我所知,我已经采纳了每一个问题的建议,但运气不好。当我将设备从纵向旋转到横向时,我想更改背景图像。然而,在我尝试的每一个实验中,景观中的UIImageView仍然是肖像大小

我使用的是自动布局,在IB中配置如下:

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

旋转设备时,我希望旋转UIView
viewBackground
中的所有内容(图像和所有按钮)。我相信我可以通过约束来管理按钮的移动,但需要自己旋转UIImageView
图像视图背景。因此,我添加了以下代码:

-(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];
}
-(void)视图将转换大小:(CGSize)带有转换协调器的大小:(id)协调器
{
int scaleFactor=self.traitCollection.displayScale;
NSString*源=@“已绘制”;
NSString*方向;
如果(size.width>size.height)
{
方向=@“景观”;
}
其他的
{
方向=@“纵向”;
}
NSString*平台;
if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPad)
{
平台=@“iPad”;
}
其他的
{
平台=@“iPhone”;
}
NSString*文件名=[NSString stringWithFormat:@“%@%@%@%.0fx%.0f.png”,源、平台、方向、size.width*scaleFactor、size.height*scaleFactor];
//确认:我们已组装正确的新图像名称。
viewBackground.frame=CGRectMake(0,0,size.width*scaleFactor,size.height*scaleFactor);
viewBackground.autoresizesSubviews=是;
viewBackground.autoresizingMask=UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
imageViewBackground.autoresizesSubviews=是;
imageViewBackground.autoresizingMask=UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
imageViewBackground.image=[UIImage ImageName:filename];
}
问题:屏幕上显示正确的图像,但如上所述,它仍然具有纵向尺寸。我敢肯定,随着艺术品的显著不同,图像会发生变化,元素水平堆叠与垂直堆叠。但新图片在横向模式下被水平剪切

我尝试过将各种各样的野生值放入
newRect
,但它们都没有任何区别。即使我在
newRect
中彻底更改原点,图像也不会实际移动。因此,我目前的理论是,我对视图大小的更改被忽略/过度写入


问题:我遗漏了什么阻止将图像大小调整为横向模式?还有其他一些我没有提到的自动调整尺寸的方面吗?

因此,这个问题变成了故事中的另一个变量。UIImageView上还必须有一个约束,每边都是0,并且“约束到未选中的边距”。显然,当我之前执行该步骤时,实际上并没有执行该步骤

不过,我必须承认,我真的不明白这种约束对我有什么影响。这很明显使旋转工作,但我不明白为什么。从技术上讲,这就是我最初问题的答案,如果有人能解释这个约束是如何实现这个场景的,我很乐意给出答案

编辑:

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

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