- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望 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/
我的应用程序有一个错误。这个错误的原因是 UIViewController 在 UI 主题从浅色变为深色或从深色变为深色后更新 UITableView 单元格。 我可以修复这个bug,这个bug本身不
我发现当将应用程序放入后台时,traitCollectionDidChange 方法被调用了两次,并显示特征集合在实际上没有进行任何更改时会有所不同。 - (void)traitCollectionD
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.tr
我正在努力采用多任务处理来支持应用程序的 Split View,但我发现当应用程序位于右侧时未调用 traitCollectionDidChange。 有人知道吗? 最佳答案 您可以在您的 ViewC
在我的应用程序中,我允许用户覆盖设备上设置的外观。如果他们想覆盖系统范围的外观,这是处理更新 UI 的类: class UserInterfaceStyleController { init() {
我基于我的 UIView 子类中的框架使用 CALayer 做了一些绘图,我需要在设备旋转时更新线,但在 traitCollectionDidChange 中,框架仍然保持旋转前的值。有没有办法在旋转
UITraitEnvironment 的文档说: This method is called automatically when the current trait collection chang
我有一个包含 TableView 并显示自定义单元格的 View Controller 。我正在尝试使用 traitCollectionDidChange 方法(在单元格子类中)对内容大小类别更改使用
我有一个包含 TableView 并显示自定义单元格的 View Controller 。我正在尝试使用 traitCollectionDidChange 方法(在单元格子类中)对内容大小类别更改使用
您知道为什么即使没有 Size Class 更改也会调用 traitCollectionDidChange 吗? 选择一个 UILabel,我在 Storyboard属性检查器/已安装 UILabel
在我的例子中,我正在根据 traitCollection.horizontalSizeClass 更改我的 View 布局这是我的代码片段。 override func traitCollecti
我有一个 swift 项目,其中包含一个使用 Size Classes 的 Storyboard,一个符合 UITraitEnvironment 协议(protocol)并实现了函数 traitCol
我的应用程序使用自定义颜色主题,但 iOS13 用户可以选择进入以下暗模式。 我以为我可以简单地在 ViewController's 中更新我的颜色traitCollectionDidChange()
我想支持类似Safari的布局,在水平规则的环境下,按钮显示在导航栏上,但在水平紧凑的环境下,有些按钮在导航栏上,有些按钮在工具栏上。 这就是我的 traitCollectionDidChange o
UITraitEnvironment 的文件说: This method is called automatically when the current trait collection chang
我希望 UIImageView 中的图像为我们提供一个不同的图像文件,该文件经过裁剪以在方向从纵向更改为横向时正确填充横向模式。以下所有代码都在扩展 UIViewController 的类中定义。 当
我用 UISplitViewController .当用户将他的 iPhone 6 Plus 旋转为纵向并且不再看到任何细节时,我想显示一个空的选择细节场景。 (所有其他设备的行为都可以预测。只有 6
TL;DR 在 Xcode 11 上 一些 应用程序布局因 iOS 13 而损坏(以下操作系统都可以)。当我进入后台并返回时,它是固定的...除非 UIUserInterfaceStyle 设置为 L
我是一名优秀的程序员,十分优秀!