UIImageView并不总是着色模板图像
在下面的情况下,有两个UIImageViews具有相同的设置和相同的模板图像…但一个色调图像,一个不
我重复工作UIImageView
并将其放置而不是另一个并且它工作。 这发生在我身上多次,这个解决方案总能奏效,但我仍然想知道我做错了什么? 可以是xcode bug吗? 发生过类似事情吗? 我有Xcode 8.1。
易修复解决方案:
只需添加一个新的运行时属性,它将UIImageView的tintColor设置为指定的颜色,并确保图像着色。
您仍然需要将图像设置为在Images.xcassets文件中呈现为模板图像。
这样您就不需要任何额外的sockets,扩展或代码行。
另请注意:如果视图上的tintColor颜色相同,则不会在用户定义的属性中应用tintColor,它们必须不同。
问题源于没有空状态的色调值(在Storyboard / Interface Builder UI中)。 为了让XCode决定是否应该将色调应用于UIImageView
,似乎还有一个额外的测试。 在XCode中,这显然是通过评估应用于UIImageView
的约束来完成的。 据我所知,这个测试没有记录。
如果在UIImageView
两侧(或一侧)上只有“最近邻居间距”约束,则无论为UIImage.renderingMode
设置的值如何,都不会应用该色调。
如果在UIImageView
三个(或所有)边上有“最近邻居间距”约束,则在UIImage.renderingMode
设置为.alwaysTemplate
应用色调。
在纯粹的Storyboard / Interface Builder方法中,您可以通过将图像添加到资产目录,然后将图像集的“渲染为”属性更改为“模板图像”来设置图像的UIImage.renderingMode
。
尝试以编程方式设置tintColor,它为我解决了问题。
我认为UIImageView中存在一个错误。 如果在故事板中设置了色调,即使资源设置为呈现为模板,它也不会应用该色调。
解决方法是将色调颜色应用于故事板中的UIImageView的父视图。
或者,将tintColor设置为nil,然后通过将UIImageView绑定到sockets再将其设置为代码。
使用此扩展从界面构建器设置UIImageView tintColor。
extension UIImageView { @IBInspectable var imageColor: UIColor! { set { super.tintColor = newValue } get { return super.tintColor } } }
我发现最好的解决方案不需要子类或其他IBInspectable
属性:
import UIKit extension UIImageView { override open func awakeFromNib() { super.awakeFromNib() self.tintColorDidChange() } }
运行时属性技巧对我不起作用。 我做这个课只是为了修理这种东西。 您只需将所有有问题的图像视图设置为此类。
final class TintedImageView: UIImageView { // WORKAROUND: Template images are not tinted for image views added using the Inteface Builder. override func layoutSubviews() { super.layoutSubviews() let preferredTintColor = tintColor tintColor = nil tintColor = preferredTintColor } }
- 自定义MKMapView标注不响应触摸事件
- 当我转换为视网膜显示时,瓷砖地图的错误位置
- 正确的创build新对象的方法是在应用程序委托中定义的NSDictionary和NSArray对象的副本
- Googlelogin不会返回到我的应用程序
- 将SQL存储添加到NSPersistentStoreCoordinator时如何debugging/处理间歇性的“授权被拒绝”和“磁盘I / O”错误?
- Multipart / Formdata图片上传,获取文件
- Swift,Xcode和iOS我的冒险
- 在UIkit中创建iOS自定义视图
- CocoaPods UIImageView + AFNetworking.h无法识别的select器setImageWithURLRequest