Bir film şeridinden veya xib düzenleyiciden bir UIImage
'i değiştirmek mümkün renderingMode
müdür?
Amaç, tintColor
belirli bir UIImageView
nesneye uygulamaktır.
Bir film şeridinden veya xib düzenleyiciden bir UIImage
'i değiştirmek mümkün renderingMode
müdür?
Amaç, tintColor
belirli bir UIImageView
nesneye uygulamaktır.
Yanıtlar:
Bunu .xib veya film şeridi dosyalarında şu şekilde yapabilirsiniz:
(Obj-C) Şurada bir kategori oluşturun UIImageView
:
@interface UIImageView (Utils)
- (void)setImageRenderingMode:(UIImageRenderingMode)renderMode;
@end
@implementation UIImageView (Utils)
- (void)setImageRenderingMode:(UIImageRenderingMode)renderMode
{
NSAssert(self.image, @"Image must be set before setting rendering mode");
self.image = [self.image imageWithRenderingMode:renderMode];
}
@end
(Swift 4) Şunun için bir uzantı oluşturun UIImageView
:
extension UIImageView {
func setImageRenderingMode(_ renderMode: UIImage.RenderingMode) {
assert(image != nil, "Image must be set before setting rendering mode")
// AlwaysOriginal as an example
image = image?.withRenderingMode(.alwaysOriginal)
}
}
Ardından, xib dosyasındaki Kimlik Denetçisinde bir çalışma zamanı özniteliği ekleyin:
Görüntü işleme modunu .xib
dosyada değil, bir .xcassets
kitaplıkta ayarlayabilirsiniz .
Bir varlık kitaplığına bir görüntü ekledikten sonra, görüntüyü seçin ve Xcode'un sağ tarafındaki nitelik denetçisini açın. "Farklı Oluştur" özelliğini bulun ve "şablon" olarak ayarlayın.
Bir görüntünün oluşturma modunu ayarladıktan sonra, görüntü rengini ayarlamak için UIImageView
bir .xib
veya .storyboard
dosyadaki öğesine bir renk tonu ekleyebilirsiniz .
Bu, yalnızca bir arabirim oluşturucu dosyası yerine görüntüdeki özelliği kullanıldığı her yerde ayarlar, ancak hemen hemen tüm durumlarda (karşılaştığım) bu, istediğiniz davranıştır.
Dikkat edilmesi gereken birkaç nokta:
UIImageView
. O kadar derinlemesine bakmadım.UIKitComponents
, UIButton
's ve UIBarButtonItem
' ler içindeki resimler gibi diğerlerinde de harika çalışır .UIImageView
, bu nedenle uygulama çalıştırılırken ton rengi her zaman gösterilmiyor.
Şablon oluşturma modunu bir film şeridinde veya xib'de UIImageView ile kullanmak hem iOS 7 hem de iOS 8'de çok hatalı.
UIImage film şeridi / xib'den düzgün bir şekilde çözülmedi. Eğer incelemek Eğer imageView.image.renderingMode
tesise viewDidLoad
yöntemiyle, bunu her zaman olduğunu göreceksiniz UIImageRenderingModeAutomatic
bunu ayarlı olsa bile, As Template Resmi Render sizin xcassets dosyasında.
Geçici çözüm için, oluşturma modunu manuel olarak ayarlamanız gerekir:
self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImage düzgün bir şekilde çözülür ve renderingMode
özelliği xcassets dosyasında seçileni yansıtır ancak görüntü renklendirilmez.
Çözüm için iki seçeneğiniz vardır:
tintColor
Özelliği , Nitelikler denetçisi bölmesi yerine Kullanıcı Tanımlı Çalışma Zamanı Niteliklerinde ayarlayın .veya
UIColor *tintColor = self.imageView.tintColor;
self.imageView.tintColor = nil;
self.imageView.tintColor = tintColor;
Her ikisi de görüntüyü uygun şekilde renklendirmek için tercih ettiğiniz seçeneği seçebilirsiniz.
(Xcode 6.2 ile derliyorsanız, sadece yapmak self.imageView.tintColor = self.imageView.tintColor;
yeterlidir ancak Xcode 6.3 ile derliyorsanız artık bu çalışmaz)
Hem iOS 7 hem de iOS 8'i desteklemeniz gerekiyorsa, her iki geçici çözüme de ihtiyacınız olacak. Yalnızca iOS 8'i desteklemeniz gerekiyorsa, yalnızca bir geçici çözüm gerekir.
İmageView RenderingMode'u film şeridinde ton rengini kullanacak şekilde ayarlamak tek satıra indirgenebilir:
[self.imageView setImage:[self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
Ardından, görüntü ve renk tonunun tümü Storyboard'da ayarlanabilir.
.Xib sorunlarını bir uzantıyla düzeltebilirsiniz:
import UIKit
// fixing Bug in XCode
// http://openradar.appspot.com/18448072
extension UIImageView {
override open func awakeFromNib() {
super.awakeFromNib()
self.tintColorDidChange()
}
}
Kaynak: https://gist.github.com/buechner/3b97000a6570a2bfbc99c005cb010bac
Şaşırtıcı, bu böcek yaklaşık 4-5 yıldır ortalıkta.
Ayarlayabilir cann't renderingMode
gelen ya storyboard
ya xib
. Programlı olarak erişebilir.
ör .:
UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIImage *selectedImage = [unSeletedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Storyboard'da tintColor & Class'ı ayarlayın.
//
// TintColoredImageView.swift
// TintColoredImageView
//
// Created by Dmitry Utmanov on 14/07/16.
// Copyright © 2016 Dmitry Utmanov. All rights reserved.
//
import UIKit
@IBDesignable class TintColoredImageView: UIImageView {
override var image: UIImage? {
didSet {
let _tintColor = self.tintColor
self.tintColor = nil
self.tintColor = _tintColor
}
}
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
override init(image: UIImage?) {
super.init(image: image)
initialize()
}
override init(image: UIImage?, highlightedImage: UIImage?) {
super.init(image: image, highlightedImage: highlightedImage)
initialize()
}
func initialize() {
let _tintColor = self.tintColor
self.tintColor = nil
self.tintColor = _tintColor
}
}
Düzeltmesi çok kolay
Sadece UIImageViewPDF sınıfı oluşturun ve bunu film şeridinizde kullanın
IB_DESIGNABLE
@interface UIImageViewPDF : UIImageView
@end
@implementation UIImageViewPDF
- (void) didMoveToSuperview
{
[super didMoveToSuperview];
self.image = [self.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
id color = self.tintColor;
self.tintColor = color;
}
@end
Başka bir çözüm de bir UIImageView
alt sınıf oluşturmaktır :
final class TemplateImageView: UIImageView {
override func awakeFromNib() {
super.awakeFromNib()
guard let oldImage = image else { return }
image = nil
image = oldImage.withRenderingMode(.alwaysTemplate)
}
}
Ardından, Interface Builder'daki sınıfı olarak ayarlayın TemplateImageView
.
Storyboard'dan ayarlanmanın basit yolu:
@IBDesignable
public class CustomImageView: UIImageView {
@IBInspectable var alwaysTemplate: Bool = false {
didSet {
if alwaysTemplate {
self.image = self.image?.withRenderingMode(.alwaysTemplate)
} else {
self.image = self.image?.withRenderingMode(.alwaysOriginal)
}
}
}
}
İOS 10 ve Swift 3'te iyi çalışıyor
İOS 9 ayarında, tintColor
Interface Builder'daki özellik hala hatalı.
Satırları doğrudan ImageView
özellikleri değiştirmenin yanı sıra çalışan bir çözümün varlık kataloğunda Farklı Oluştur: Şablon Görüntüsünü ayarlamak ve örneğin:
[[UIImageView appearanceWhenContainedInInstancesOfClasses:@[[MyView class]]] setTintColor:[UIColor whiteColor]];
Bir IBOutlet oluşturursanız, bunu awakeFromNib yönteminizde şu şekilde değiştirebilirsiniz ...
self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
@ Moby'nin cevabı daha doğru olsa da - bu daha kısa ve öz olabilir.
Çılgınca bu hata hala iOS 12.1'de! Film şeritleri / xibs için: UIImageView'a bir etiket eklemek hızlı bir düzeltme olabilir.
Swift 4.2
view.viewWithTag(1)?.tintColorDidChange()
extension UIImageView {
@IBInspectable var renderModeTemplate : Bool {
get{
return image?.renderingMode == .alwaysTemplate
}
set{
image = image?.withRenderingMode(newValue ? .alwaysTemplate:.alwaysOriginal)
}
}
}
Film şeridinde UIImageView öğesini seçin ve denetçiyi seçin, özelliği ayarlayın renderModeTemplate
= On
Öykü Panosunda
Rudolf'un yukarıda da bahsettiği gibi , şöyle basit bir sınıf tanımlardım:
import UIKit
@IBDesignable class TintImage: UIImageView{
override func layoutSubviews() {
super.layoutSubviews()
image = image?.withRenderingMode(.alwaysTemplate)
}
}
Bu tanımdan sonra, film şeridine bir Resim Görünümü ekleyin ve özel sınıfını TintImage
. Bu, film şeridindeki "Ton" seçimini etkinleştirecektir.