【问题标题】:How do I change UIImageView image in view controller in traitCollectionDidChange如何在 traitCollectionDidChange 的视图控制器中更改 UIImageView 图像
【发布时间】:2019-02-13 00:29:49
【问题描述】:

我希望 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 的重要内容。任何帮助表示赞赏。

【问题讨论】:

    标签: ios objective-c xcode


    【解决方案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? 中了解更多关于 Objective-C 中自动合成属性的混乱情况@

    编辑——

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

    (在此 - 您可能需要重新评估您对“横向”与“纵向”图像的要求,因为 iOS 应用程序可以在各种环境中运行,iPad / iPhone / 紧凑型......这很复杂。@987654322 @)

    要完成答案,这应该可以在 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"]];
             }
        }
    }
    

    【讨论】:

    • 我进行了建议的更改,但仍然无法正常工作。当我在添加更改之前单步执行时,我注意到该属性设置为 nil,并且在添加更改后它被正确设置。但即便如此,我的图像视图上的图像仍然是相同的图像。在_storage>_imageAsset>_assetName 属性下的调试器中,我看到一旦我越过覆盖图像的行,它就会更改为新的图像名称,但是当我查看视图调试器时,它仍然使用横向的旧图像模式。
    • 没关系,它肯定会出现在视图调试器中。我只需要再搞砸它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多