Ios 如何在traitCollectionDidChange中的视图控制器中更改UIImageView图像
我希望UIImageView中的图像为我们提供一个不同的图像文件,当方向从纵向更改为横向时,该文件被剪切以正确填充横向模式。以下所有代码都是在扩展Ios 如何在traitCollectionDidChange中的视图控制器中更改UIImageView图像,ios,objective-c,xcode,Ios,Objective C,Xcode,我希望UIImageView中的图像为我们提供一个不同的图像文件,当方向从纵向更改为横向时,该文件被剪切以正确填充横向模式。以下所有代码都是在扩展UIViewController的类中定义的 当手机旋转时,肯定会调用以下函数,因为myprintf函数正在打印输出 - (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection { [super traitCollectionDidChang
UIViewController
的类中定义的
当手机旋转时,肯定会调用以下函数,因为myprintf
函数正在打印输出
- (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
属性下的调试器中,我看到一旦我跨过覆盖图像的行,它将更改为新的图像名称,但是当我查看视图调试器时,它仍然在横向模式下使用旧图像。不管怎样,它肯定会显示在视图调试器中。我只需要再把它弄得一团糟。