如何在traitCollectionDidChange的视图控制器中更改UIImageView图像

时间:2019-02-13 00:29:50

标签: ios objective-c xcode

我希望UIImageView中的图像提供给我们一个不同的图像文件,该图像文件在方向从纵向更改为横向时,裁剪为正确填充横向模式。以下所有代码均在扩展UIViewController的类中定义。

由于我的printf函数正在打印到输出,因此在手机旋转时肯定会调用以下函数。

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {

    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || (self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        printf("Orientation Change!\n");
        UIImage * newImage = [UIImage imageNamed: @"landscape-image"];
        [self.imageView setImage:newImage];
    }
}

我在.h文件中定义了属性imageView,如下所示:

@property (nonatomic, nonnull, readonly) UIImageView * imageView;

然后按如下所示初始化imageView:

UIImage * image = [UIImage imageNamed:@"portrait-image"];
UIImageView * _imageView = [[UIImageView alloc] initWithImage:image];
_imageView.contentMode = UIViewContentModeScaleAspectFill;
_imageView.translatesAutoresizingMaskIntoConstraints = NO;
[pageView addSubview:_imageView];

但这对我不起作用。当我改变方向时,imageView图像保持不变,并且像往常一样放大。由于手机旋转时会调用traitCollectionDidChange函数,因此我认为问题必须出在如何更改图像上。我是iOS开发的新手,所以我可能会缺少更新UIImageViews的重要内容。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

使用UIImageView * _imageView = [[UIImageView alloc] initWithImage:image];创建imageView时,您将使用具有相同名称的新变量来遮盖自动合成的变量_imageView。

因此,新创建的UIImageView实例未分配给imageView属性。结果,当旋转设备并运行第二种方法时,self.imageView为nil,并且您调用[self.imageView setImage:newImage]不会执行任何操作。

要解决此问题,您所需要做的就是将UIImageView * _imageView = [[UIImageView alloc] initWithImage:image];替换为_imageView = [[UIImageView alloc] initWithImage:image];

此答案When should I use @synthesize explicitly?

中有关Object-C中自动合成属性的混乱情况的更多信息

编辑-

此外,- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection可能会在任何时候被调用,并且最初会被调用,因此您想用该方法检测方向,而不仅仅是将图像设置为风景图像。

(而且,您可能需要重新评估有关“风景”与“人像”图像的要求,因为iOS应用可以在iPad / iPhone /紧凑型电脑等多种环境中运行。.{{ 3}})

要完成答案,这应该可以在iPhone上使用

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {

    [super traitCollectionDidChange: previousTraitCollection];

    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || (self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {

         if (self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
              [self.imageView setImage:[UIImage imageNamed: @"landscape-image"]];
         } else if (self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular
                    && self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
             [self.imageView setImage:[UIImage imageNamed: @"portrait-image"]];
         }
    }
}