Ios8 未正确呈现UIButton’;使用资源目录和大小类的s图像属性

Ios8 未正确呈现UIButton’;使用资源目录和大小类的s图像属性,ios8,asset-catalog,size-classes,Ios8,Asset Catalog,Size Classes,我对UIButton的图像属性有问题。“我的资产目录”包含任意大小类别的默认图像以及特定于常规/常规类别的图像。当我在Interface Builder中将UIButton的图像属性设置为“img_facebook”时,图像在iPad上的渲染不正确(选择任意/任意大小的图像,而不是常规/常规图像)。但是,当我在“traitCollectionDidChange:”方法中刷新它时,图像就会正确呈现(请参阅附带的代码片段) 看起来IB创建了一个UIImage实例,并只将其分配给属性一次。这是有道理的

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

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


有没有人经历过类似的问题?有没有可能在IB中修复这个问题,或者我必须在代码中手动重置映像?

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


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

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

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


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

我也有同样的问题,我找到的唯一方法是使用另一个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碰巧发生在按钮上以自动获得图像更改。

但是它是否适用于分配给设备特定资产的大小类?如果您选择我提供的解决方法,则您将获得设备特定的图像(iPad或iPhone)还有一个是针对该设备的屏幕比例进行优化的。因此,是的,它会满足您的要求。使用大小类还有其他方法可以实现这一点,例如,您可以通过自己的视图控制器将大小类强制放到代码中的按钮上。我的解决方法就是完全避免编写任何代码。在iOS 9中,当您需要nt在iPad上使用除常规x常规以外的尺寸类别。你有没有找到更好的方法解决这个问题?在这个问题上提交了一个雷达。希望他们能解决这个问题。Jacob这个问题在没有状态改变的情况下也会发生。顺便说一句,如果我为compact设置了不同的按钮图像,然后用iPhone 6+在纵向上启动,它会显示非紧凑的图像。旋转到横向和背部,它拿起了紧凑的版本。
<UITraitCollection: 0x7ff6f48a1640; _UITraitNameUserInterfaceIdiom = Phone, _UITraitNameDisplayScale = 2.000000, _UITraitNameHorizontalSizeClass = Compact, _UITraitNameVerticalSizeClass = Regular, _UITraitNameTouchLevel = 0, _UITraitNameInteractionModel = 1>
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];