3

我遇到了 UIButton 的 image 属性的问题。我的资产目录包含任何/任何尺寸类的默认图像和特定于常规/常规类的图像。当我在 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 中解决这个问题,还是我必须在代码中手动重置图像?

4

2 回答 2

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 以使用特定于设备的选项而不是大小类:

在此处输入图像描述

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

于 2015-04-08T10:54:05.260 回答
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 才能自动获取图像更改。

于 2015-09-14T07:36:48.037 回答