使用资产目录和大小类错误地呈现UIButton的image属性

时间:2014-11-12 22:53:12

标签: ios8 asset-catalog size-classes

我遇到了UIButton图像属性的问题。我的资产目录包含Any / Any尺寸类的默认图像以及特定于Regular / Regular类的图像。当我在Interface Builder中将UIButton的图像属性设置为“img_facebook”时,iPad上的图像呈现不正确(选择任意/任意大小的图像而不是常规/常规图像)。但是当我在“traitCollectionDidChange:”方法中刷新它时,图像会正确呈现(请参阅附带的代码片段)。

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
    [super traitCollectionDidChange:previousTraitCollection];
    [_facebookButton setImage:[UIImage imageNamed:@"img_facebook"] forState:UIControlStateNormal];
}

看起来IB创建了一个UIImage实例并仅将其分配给属性一次。这是有道理的,但如果我用UIImage而不是UIButton做同样的事情,一切都很好。

有没有人遇到类似的问题?可以在IB中修复它还是我必须在代码中手动重置图像?

2 个答案:

答案 0 :(得分:1)

我刚遇到类似的问题。它似乎是UIButton的一个错误。我检查了我的按钮的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)

答案 1 :(得分: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碰巧按钮以自动更改图像。