Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在traitCollectionDidChange中的视图控制器中更改UIImageView图像_Ios_Objective C_Xcode - Fatal编程技术网

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

Ios 如何在traitCollectionDidChange中的视图控制器中更改UIImageView图像,ios,objective-c,xcode,Ios,Objective C,Xcode,我希望UIImageView中的图像为我们提供一个不同的图像文件,当方向从纵向更改为横向时,该文件被剪切以正确填充横向模式。以下所有代码都是在扩展UIViewController的类中定义的 当手机旋转时,肯定会调用以下函数,因为myprintf函数正在打印输出 - (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection { [super traitCollectionDidChang

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

当手机旋转时,肯定会调用以下函数,因为my
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;
UIImage * image = [UIImage imageNamed:@"portrait-image"];
UIImageView * _imageView = [[UIImageView alloc] initWithImage:image];
_imageView.contentMode = UIViewContentModeScaleAspectFill;
_imageView.translatesAutoresizingMaskIntoConstraints = NO;
[pageView addSubview:_imageView];

我初始化imageView如下:

@property (nonatomic, nonnull, readonly) UIImageView * 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开发还比较陌生,所以我可能错过了一些更新UIImageView的重要内容。非常感谢您的帮助。

当您使用
UIImageView*\u imageView=[[UIImageView alloc]initWithImage:image]创建imageView时,使用同名的新变量对自动合成的变量_imageView进行阴影处理

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

要解决这个问题,只需替换
UIImageView*\u imageView=[[UIImageView alloc]initWithImage:image]带有
\u imageView=[[UIImageView alloc]initWithImage:image]

更多关于Objective-C中自动合成属性的混乱性,请参见本答案

编辑--

此外,可以随时调用
-(void)traitCollectionDidChange:(UITraitCollection*)先前的traitcollection
,因此您希望在该方法中检测方向,而不仅仅是将图像设置为横向图像

(在这方面,你可能想重新评估你对“横向”与“纵向”图像的要求,因为iOS应用程序可以在各种环境下运行,比如iPad/iPhone/compact。这很复杂。)

要完成回答,这应该在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,并且在添加更改之后,它被正确设置。但即使如此,我的图像视图上的图像仍然是相同的图像。在
\u storage>\u imageAsset>\u assetName
属性下的调试器中,我看到一旦我跨过覆盖图像的行,它将更改为新的图像名称,但是当我查看视图调试器时,它仍然在横向模式下使用旧图像。不管怎样,它肯定会显示在视图调试器中。我只需要再把它弄得一团糟。