使用资源目录和尺寸类渲染UIButton图像属性时出现错误

3
我遇到了UIButton的图像属性问题。我的资源目录包含Any / Any大小类的默认图像和针对Regular / Regular类的特定图像。当我在Interface Builder中将UIButton的图像属性设置为“img_facebook”时,iPad上的图像呈现不正确(选择了Any / Any大小的图像而不是Regular / Regular的图像)。但是当我在“traitCollectionDidChange:”方法中刷新它时,图像就会正确呈现(请参见附加的代码片段)。
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
    [super traitCollectionDidChange:previousTraitCollection];
    [_facebookButton setImage:[UIImage imageNamed:@"img_facebook"] forState:UIControlStateNormal];
}

看起来IB只创建了一个UIImage实例并将其分配给属性。 这是有道理的,但如果我使用UIImage而不是UIButton做同样的事情,一切都可以完美地工作。

有人遇到类似的问题吗? 是否可能在IB中修复它或者我必须在代码中手动重置图像?


在iOS 9中,如果您想在iPad上使用除“常规x常规”之外的尺寸类别,则这将是更大的问题。您是否找到了更好的解决方法? - Trey Bean
1
已在此问题上提交了雷达报告。希望他们能够解决。https://openradar.appspot.com/22593495 - Jacob Pritchett
Jacob,顺便说一下,问题也发生在没有状态更改的情况下。如果我为紧凑模式设置不同的按钮图像,然后在iPhone6+上以纵向启动,则会显示非紧凑图像。旋转到横向再返回,它就会选择紧凑版本。 - trapper
2个回答

1

我刚遇到了类似的问题。这似乎是UIButton的一个bug。我检查了我的按钮的traitCollection属性(通过Interface Builder添加到常规视图控制器视图中):

<UITraitCollection: 0x7ff6f27a8930; _UITraitNameUserInterfaceIdiom = Phone, _UITraitNameDisplayScale = 2.000000>

它缺少预期的尺寸类。例如,父视图traitCollection如下所示:

<UITraitCollection: 0x7ff6f48a1640; _UITraitNameUserInterfaceIdiom = Phone, _UITraitNameDisplayScale = 2.000000, _UITraitNameHorizontalSizeClass = Compact, _UITraitNameVerticalSizeClass = Regular, _UITraitNameTouchLevel = 0, _UITraitNameInteractionModel = 1>

最简单的解决方法是修改您的UIImageAsset,使用“设备特定”选项而不是大小类别:

enter image description here

并添加iPhone和iPad特定的图像。这对我解决了问题(Xcode Beta 6.3)


但是它是否适用于分配给特定设备资源的大小类? - mateusz.dzwonek
如果您选择我提供的解决方法,那么您将得到一个特定于设备(iPad或iPhone)的图像,并且针对该设备的屏幕比例进行了优化。所以是的,它会做你想要的事情。使用大小类别还有其他实现方式 - 例如,您可以通过您拥有的视图控制器在代码中强制将大小类别应用于按钮。我的解决方法只是避免了编写任何代码的麻烦。 - Nick Kuh

1

我有同样的问题,唯一的解决办法是使用另一个API将正确的图像设置为按钮。

UIImage *image;
if ( NSClassFromString(@"UITraitCollection") ) { //need to support iOS7
    image = [UIImage imageNamed:@"xxx" inBundle:nil compatibleWithTraitCollection:self.traitCollection];
} else {
    image = [UIImage imageNamed:@"xxx"];
}
[button setImage:image forState:UIControlStateNormal];

根据我的测试,似乎只有在调用按钮的traitCollectionDidChange时,按钮的图像才会自动更改为相应的特征。这意味着如果您想手动控制按钮的图像,必须在将图像设置为按钮时获取正确的特征图像,否则您需要等待下一个traitCollectionDidChange发生在按钮上才能自动获取图像更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接