gpt4 book ai didi

ios - 如何在 traitCollectionDidChange 的 View Controller 中更改 UIImageView 图像

转载 作者:行者123 更新时间:2023-11-28 23:36:56 26 4
gpt4 key购买 nike

我希望 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 的一些重要内容。感谢您的帮助。

最佳答案

当您使用 UIImageView * _imageView = [[UIImageView alloc] initWithImage:image]; 创建 imageView 时,您将使用同名的新变量来隐藏自动合成的变量 _imageView。

新创建的 UIImageView 实例因此没有分配给 imageView 属性。因此,当设备旋转并运行第二个方法时,self.imageView 为零,并且您调用 [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/紧凑型.. 这很复杂。https://developer.apple.com/documentation/uikit/uitraitcollection )

要完成答案,这应该适用于 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"]];
}
}
}

关于ios - 如何在 traitCollectionDidChange 的 View Controller 中更改 UIImageView 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com