এটি একটি সংশোধন করা সম্ভব 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
লাইব্রেরিতে সেট করতে পারেন ।
কোনও সম্পদ লাইব্রেরিতে কোনও চিত্র যুক্ত করার পরে, চিত্রটি নির্বাচন করুন এবং এক্সকোডের ডানদিকে বৈশিষ্ট্য পরিদর্শকটি খুলুন। 'রেন্ডার অ্যাস' হিসাবে বৈশিষ্ট্যটি সন্ধান করুন এবং এটি 'টেমপ্লেট' এ সেট করুন।
কোনও চিত্রের রেন্ডারিং মোড সেট করার পরে, আপনি চিত্রের রঙ সামঞ্জস্য করতে UIImageView
একটি .xib
বা .storyboard
ফাইলের মধ্যে একটি রঙিন রঙ যুক্ত করতে পারেন ।
এটি কেবলমাত্র একটি ইন্টারফেস বিল্ডার ফাইলের চেয়ে চিত্রটিতে সম্পত্তি যেখানেই ব্যবহৃত হয় তা সেট করে তবে প্রায় সব ক্ষেত্রেই (যে আমি মুখোমুখি হয়েছি) এটি আপনার পছন্দসই আচরণ।
কয়েকটি বিষয় লক্ষণীয়:
UIImageView
। আমি গভীরভাবে এটি তাকান না।UIKitComponents
চিত্র যেমন UIButton
's এবং UIBarButtonItem
এর।UIImageView
, তাই অ্যাপটি চালানোর সময় সবসময় রঙিন রঙটি প্রদর্শিত হয় না।
স্টোরিবোর্ডে বা এক্সআইবিতে ইউআইআইমেজভিউয়ের সাথে টেমপ্লেট রেন্ডারিং মোড ব্যবহার করা আইওএস 7 এবং আইওএস 8 উভয়ই খুব বগিযুক্ত।
ইউআইআইজেজ স্টোরিবোর্ড / এক্সবি থেকে সঠিকভাবে ডিকোড হয় না। আপনি যদি পদ্ধতিটিতে imageView.image.renderingMode
সম্পত্তিটি পরিদর্শন করেন তবে আপনি viewDidLoad
খেয়াল করবেন যে এটি সর্বদা UIImageRenderingModeAutomatic
, এমনকি যদি আপনি এটি আপনার xcassets ফাইলে টেম্পলেট চিত্র হিসাবে রেন্ডার হিসাবে সেট করেন ।
একযোগে কাজ করতে আপনাকে নিজেই রেন্ডারিং মোডটি সেট করতে হবে:
self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
ইউআইআইজেজটি সঠিকভাবে ডিকোড করা হয়েছে এবং এর renderingMode
বৈশিষ্ট্যটি প্রতিবিম্বিত করে যা এক্সক্যাসেট ফাইলে বেছে নেওয়া হয়েছিল তবে চিত্রটি রঙিন নয়।
একযোগে কাজ করতে আপনার কাছে দুটি বিকল্প রয়েছে:
tintColor
সম্পত্তি সেট করুন ।বা
UIColor *tintColor = self.imageView.tintColor;
self.imageView.tintColor = nil;
self.imageView.tintColor = tintColor;
আপনি আপনার পছন্দসই বিকল্পটি চয়ন করতে পারেন, উভয়ই চিত্রটিকে সঠিকভাবে আঁকুন।
(আপনি যদি এক্সকোড .2.২ নিয়ে সংকলন self.imageView.tintColor = self.imageView.tintColor;
করে থাকেন তবে কেবল করা যথেষ্ট হয়েছে তবে আপনি যদি এক্সকোড .3.৩ সহ সংকলন করছেন তবে এটি আর কাজ করে না)
আপনার যদি আইওএস 7 এবং আইওএস 8 উভয়ই সমর্থন করার প্রয়োজন হয় তবে আপনার উভয় কার্যকার্য প্রয়োজন। আপনার যদি কেবল আইওএস 8 সমর্থন করতে হয় তবে কেবলমাত্র একটি কাজের প্রয়োজন।
স্টোরিবোর্ডে রঙিন রঙটি ব্যবহার করতে চিত্রভিউ রেন্ডারিংমড সেট করা ওয়ান-লাইনারে হ্রাস করা যেতে পারে:
[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 বছরের মতো প্রায় হয়েছে।
আপনি সেট সূত্র 't 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
}
}
এটি ঠিক করা খুব সহজ
কেবল ক্লাস ইউআইআইমেজভিউপিডিএফ তৈরি করুন এবং এটি আপনার স্টোরিবোর্ডে ব্যবহার করুন
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)
}
}
}
}
আইওএস 10 এবং সুইফট 3 এ সূক্ষ্মভাবে কাজ করে
আইওএস 9 tintColor
এ ইন্টারফেস বিল্ডারে সম্পত্তি সেট করা এখনও বগি।
নোট করুন যে সরাসরি ImageView
বৈশিষ্ট্য সংশোধন করে রেখাগুলি লেখার পাশাপাশি একটি কার্যক্ষম সমাধান হ'ল সম্পদ ক্যাটালগটিতে রেন্ডার হিসাবে: টেম্পলেট চিত্র সেট করা এবং উদাহরণস্বরূপ কল করুন:
[[UIImageView appearanceWhenContainedInInstancesOfClasses:@[[MyView class]]] setTintColor:[UIColor whiteColor]];
যদি আপনি একটি আইবিউটলেট তৈরি করেন তবে আপনি নিজের জাগ্রত থেকে এটি পরিবর্তন করতে পারেন যেমন থেকে ...
self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
যদিও @ মবির উত্তরটি আরও সঠিক - এটি আরও সংহত হতে পারে।
ক্রেজি এই বাগটি এখনও আইওএস 12.1 এ রয়েছে! স্টোরিবোর্ড / এক্সিবসের জন্য: ইউআইআইমেজভিউতে একটি ট্যাগ যুক্ত করা দ্রুত সমাধান হতে পারে।
সুইফট 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
। এটি স্টোরিবোর্ডে "রঙ" নির্বাচন সক্রিয় করবে।