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