यह एक संशोधित करने के लिए संभव है UIImage
की renderingMode
एक स्टोरीबोर्ड या xib संपादक से?
लक्ष्य tintColor
विशेष UIImageView
वस्तु पर लागू होता है ।
यह एक संशोधित करने के लिए संभव है UIImage
की renderingMode
एक स्टोरीबोर्ड या xib संपादक से?
लक्ष्य tintColor
विशेष UIImageView
वस्तु पर लागू होता है ।
जवाबों:
यहां बताया गया है कि आप इसे .xib या स्टोरीबोर्ड फ़ाइलों में कैसे कर सकते हैं:
(ओब्ज-सी) पर एक श्रेणी बनाएँ 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
(स्विफ्ट 4) इसके लिए एक एक्सटेंशन बनाएं 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)
}
}
फिर xib फ़ाइल में पहचान निरीक्षक में, रनटाइम विशेषता जोड़ें:
आप छवि रेंडरिंग मोड को .xib
फाइल में नहीं , बल्कि .xcassets
लाइब्रेरी में सेट कर सकते हैं ।
किसी एसेट लाइब्रेरी में एक छवि जोड़ने के बाद, छवि का चयन करें और Xcode के दाईं ओर विशेषताएँ निरीक्षक खोलें। विशेषता 'रेंडर अस' को ढूंढें और इसे 'टेम्प्लेट' पर सेट करें।
छवि के रेंडरिंग मोड को सेट करने के बाद, आप छवि रंग को समायोजित करने के लिए UIImageView
एक .xib
या .storyboard
फ़ाइल में एक टिंट रंग जोड़ सकते हैं ।
यह संपत्ति को छवि पर सेट करता है जहाँ यह केवल एक इंटरफ़ेस बिल्डर फ़ाइल में उपयोग किया जाता है, लेकिन लगभग सभी मामलों में (जो मैंने सामना किया है) यह वह व्यवहार है जो आप चाहते हैं।
ध्यान देने योग्य कुछ बातें:
UIImageView
। मैंने उस पर गहराई से गौर नहीं किया है।UIKitComponents
तरह के चित्र के रूप में अन्य पर महान काम करता है UIButton
और UIBarButtonItem
एस।UIImageView
, इसलिए एप्लिकेशन चलाते समय टिंट रंग हमेशा नहीं दिखाया जाता है।
टेम्प्लेट या xib में UIImageView के साथ टेम्प्लेट रेंडरिंग मोड का उपयोग करना बहुत ही छोटी गाड़ी है, जो iOS 7 और iOS 8 दोनों पर है।
UIImage स्टोरीबोर्ड / xib से ठीक से डिकोड नहीं किया गया है। यदि आप विधि imageView.image.renderingMode
में संपत्ति का निरीक्षण करते हैं viewDidLoad
, तो आप देखेंगे कि यह हमेशा होता है UIImageRenderingModeAutomatic
, भले ही आप इसे अपने xcassets फ़ाइल में टेम्पलेट छवि के रूप में रेंडर करने के लिए सेट करें।
वर्कअराउंड करने के लिए, आपको मैन्युअल रूप से रेंडरिंग मोड सेट करना होगा:
self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImage ठीक से डिकोड किया गया है और इसकी renderingMode
संपत्ति दर्शाती है कि xcassets फ़ाइल में क्या चुना गया था लेकिन छवि टिंटेड नहीं है।
वर्कअराउंड करने के लिए, आपके पास दो विकल्प हैं:
tintColor
में संपत्ति उपयोगकर्ता निर्धारित क्रम गुण के बजाय निरीक्षक फलक गुण।या
UIColor *tintColor = self.imageView.tintColor;
self.imageView.tintColor = nil;
self.imageView.tintColor = tintColor;
आप अपना पसंदीदा विकल्प चुन सकते हैं, दोनों ही छवि को ठीक से चित्रित कर सकते हैं।
(यदि आप Xcode 6.2 के साथ संकलित कर रहे हैं, तो बस करना self.imageView.tintColor = self.imageView.tintColor;
काफी है, लेकिन यदि आप Xcode 6.3 के साथ संकलन कर रहे हैं तो यह अब और काम नहीं करता है)
यदि आपको आईओएस 7 और आईओएस 8 दोनों का समर्थन करने की आवश्यकता है, तो आपको दोनों वर्कआर्ड की आवश्यकता होगी। यदि आपको केवल iOS 8 का समर्थन करना है, तो केवल एक वर्कअराउंड की आवश्यकता है।
ImageView RenderingMode को स्टोरीबोर्ड में टिंट रंग का उपयोग करने के लिए सेट करना एक-लाइनर के लिए कम किया जा सकता है:
[self.imageView setImage:[self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
तब छवि और टिंट रंग सभी स्टोरीबोर्ड में सेट किए जा सकते हैं।
आप एक एक्सटेंशन के साथ .xib मुद्दों को ठीक कर सकते हैं:
import UIKit
// fixing Bug in XCode
// http://openradar.appspot.com/18448072
extension UIImageView {
override open func awakeFromNib() {
super.awakeFromNib()
self.tintColorDidChange()
}
}
स्त्रोत: https://gist.github.com/buechner/3b97000a6570a2bfbc99c005cb010bac
कमाल है, यह बग अब लगभग 4-5 साल से है।
आप या renderingMode
तो से सेट नहीं कर storyboard
सकते xib
। यह प्रोग्रामेटिक रूप से एक्सेस कर सकता है।
उदाहरण के लिए:
UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIImage *selectedImage = [unSeletedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
स्टोरीबोर्ड में टिंटकलर और क्लास सेट करें।
//
// 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
}
}
इसे ठीक करना बहुत आसान है
बस कक्षा UIImageViewPDF बनाएं और इसे अपने स्टोरीबोर्ड में उपयोग करें
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
एक और समाधान एक UIImageView
उपवर्ग बनाने के लिए है :
final class TemplateImageView: UIImageView {
override func awakeFromNib() {
super.awakeFromNib()
guard let oldImage = image else { return }
image = nil
image = oldImage.withRenderingMode(.alwaysTemplate)
}
}
फिर बस क्लास को इंटरफ़ेस बिल्डर में सेट करें TemplateImageView
।
स्टोरीबोर्ड से सेट होने का सरल तरीका:
@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)
}
}
}
}
IOS 10 और स्विफ्ट 3 पर ठीक काम करता है
IOS 9 tintColor
में इंटरफ़ेस बिल्डर में संपत्ति अभी भी छोटी है।
ध्यान दें कि ImageView
गुणों को सीधे लिखने वाली लाइनों को लिखने के अलावा एक काम करने वाला समाधान रेंडर को सेट करना है: एसेट कैटलॉग में टेम्प्लेट इमेज, और कॉल जैसे:
[[UIImageView appearanceWhenContainedInInstancesOfClasses:@[[MyView class]]] setTintColor:[UIColor whiteColor]];
यदि आप एक IBOutlet बनाते हैं तो आप इसे अपनी awakeFromNib विधि में बदल सकते हैं ...
self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
जबकि @ Moby का उत्तर अधिक सही है - यह अधिक रसीला हो सकता है।
पागल यह बग अभी भी iOS 12.1 में है! स्टोरीबोर्ड / xibs के लिए: UIImageView के लिए एक टैग जोड़ना एक त्वरित फिक्स हो सकता है।
स्विफ्ट 4.2
view.viewWithTag(1)?.tintColorDidChange()
extension UIImageView {
@IBInspectable var renderModeTemplate : Bool {
get{
return image?.renderingMode == .alwaysTemplate
}
set{
image = image?.withRenderingMode(newValue ? .alwaysTemplate:.alwaysOriginal)
}
}
}
स्टोरीबोर्ड में UIImageView चुनें और निरीक्षक का चयन करें, संपत्ति सेट करें renderModeTemplate
= On
स्टोरीबोर्ड में
जैसा कि रुडोल्फ ने भी ऊपर उल्लेख किया है , मैं इस तरह से एक साधारण वर्ग को परिभाषित करूंगा:
import UIKit
@IBDesignable class TintImage: UIImageView{
override func layoutSubviews() {
super.layoutSubviews()
image = image?.withRenderingMode(.alwaysTemplate)
}
}
इस परिभाषा के बाद, बस स्टोरीबोर्ड में एक छवि दृश्य जोड़ें और इसके कस्टम वर्ग को चुनें TintImage
। यह स्टोरीबोर्ड में "टिंट" चयन को सक्रिय करेगा।