স্টোরিবোর্ড / এক্সিব ফাইল থেকে ইউআইআইমেজ রেন্ডারিংমড পরিবর্তন করুন


95

এটি একটি সংশোধন করা সম্ভব UIImage'র renderingModeএকটি স্টোরিবোর্ড বা xib এডিটর থেকে?

লক্ষ্যটি tintColorনির্দিষ্ট UIImageViewঅবজেক্টে প্রয়োগ করা ।

উত্তর:


101

.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 ফাইলের পরিচয় পরিদর্শকটিতে একটি রানটাইম বৈশিষ্ট্য যুক্ত করুন:

এখানে চিত্র বর্ণনা লিখুন


44
আমি এই উত্তর সম্পর্কে যা ভালবাসি তা হ'ল এটি প্রশ্নের উত্তর।
অ্যালগাল

4
আমি মূল মান সেটিংস না করে একটি ইউআইআইমেজভিউ সাবক্লাস তৈরি করতে পছন্দ করব। কারণ এটি সেটআপ করা সহজ এবং আমরা গণনা মানের সাথে সংখ্যার সেটিং এড়াতে পারি। উদাহরণস্বরূপ: imp @ বাস্তবায়ন টেমপ্লেট রেন্ডারিংআইমেজভিউ - (আইডি) #WithCoder: (এনএসকোডার *) aDecoder {স্ব = [সুপার initWithCoder: aDecoder]; if (স্ব) {স্ব.আইমেজ = [স্ব.আইমেজ চিত্র উইথেন্ডেন্ডারিং মোড: UIImageRenderingModeAlwaysTemplate]; self স্ব স্ব ফিরে; `@ শেষ`
জন কল্পনা

4
দুর্দান্ত উত্তর! স্ক্রিনশটগুলি সহায়ক ছিল।
বিগসউস

4
অবশ্যই লঞ্চ স্ক্রিন.এক্সিবের সাথে কাজ করে না কারণ আপনি এটির সাথে ব্যবহারকারী সংজ্ঞায়িত রানটাইম বৈশিষ্ট্যগুলি ব্যবহার করতে পারবেন না।
স্টিভ মোজার

4
হার্ডকোডিং 2 একটি মান হিসাবে খারাপ খারাপ খারাপ .. এক্সক্যাসেট ক্যাটালগ ব্যবহার সঠিক উত্তর।
tgilani

199

আপনি ইমেজ রেন্ডারিং মোডটি .xibফাইলটিতে নয়, একটি .xcassetsলাইব্রেরিতে সেট করতে পারেন ।

কোনও সম্পদ লাইব্রেরিতে কোনও চিত্র যুক্ত করার পরে, চিত্রটি নির্বাচন করুন এবং এক্সকোডের ডানদিকে বৈশিষ্ট্য পরিদর্শকটি খুলুন। 'রেন্ডার অ্যাস' হিসাবে বৈশিষ্ট্যটি সন্ধান করুন এবং এটি 'টেমপ্লেট' এ সেট করুন।

কোনও চিত্রের রেন্ডারিং মোড সেট করার পরে, আপনি চিত্রের রঙ সামঞ্জস্য করতে UIImageViewএকটি .xibবা .storyboardফাইলের মধ্যে একটি রঙিন রঙ যুক্ত করতে পারেন ।

এটি কেবলমাত্র একটি ইন্টারফেস বিল্ডার ফাইলের চেয়ে চিত্রটিতে সম্পত্তি যেখানেই ব্যবহৃত হয় তা সেট করে তবে প্রায় সব ক্ষেত্রেই (যে আমি মুখোমুখি হয়েছি) এটি আপনার পছন্দসই আচরণ।

এক্সকোডের স্ক্রিনশট কোনও চিত্রের জন্য গুণাবলী পরিদর্শক দেখায়

কয়েকটি বিষয় লক্ষণীয়:

  • চিত্রটির রঙ ইন্টারফেস বিল্ডারে পরিবর্তিত হয়েছে বলে মনে হবে না (এক্সকোড 6.1.1 হিসাবে) তবে অ্যাপ্লিকেশনটি চালিত হলে কাজ করবে।
  • আমি এই বৈশিষ্ট্যটির সাথে কিছু কৌতুকপূর্ণ অভিজ্ঞতা পেয়েছি এবং কিছু পরিস্থিতিতে আমাকে এটিকে সরিয়ে পুনরায় যুক্ত করতে হয়েছিল UIImageView। আমি গভীরভাবে এটি তাকান না।
  • এটি অন্যান্য উপর কাজ করে মহান UIKitComponentsচিত্র যেমন UIButton's এবং UIBarButtonItemএর।
  • আপনার সম্পদ গ্রন্থাগারে অদৃশ্য এমন একাধিক শ্বেত চিত্র রয়েছে যদি সেগুলি কালো / স্বচ্ছ চিত্র তৈরি করে এবং রেন্ডারিং মোড পরিবর্তন করে আপনার জীবন 10x আরও উন্নত করে তুলবে।

15
সেখানে রঙিন রঙের একটি বাগ রয়েছে বলে মনে হচ্ছে UIImageView, তাই অ্যাপটি চালানোর সময় সবসময় রঙিন রঙটি প্রদর্শিত হয় না।
ফাগ

@ ফগ আমারও এর মতো কিছু বেমানান বাগ রয়েছে। রঙিন রঙ সেট করে কি প্রোগ্রামোগেটিকভাবে এটি ঠিক করে?
অ্যান্টনি ম্যাটাক্স

4
আমি নিশ্চিত করতে পারি যে আইবিতে রঙিন রঙ সেট করার সময় কোনও সমস্যা আছে। এটি প্রোগ্রামিং হিসাবে কাজ করে। আমি এটির জন্য একটি বাগ # 20305518 দায়ের করেছি।
নিকোলে ডেরকাচ

4
@ এক্সেলগুইলমিন ইউপ প্রকৃতপক্ষে কেবলমাত্র আলফা চ্যানেলটি ব্যবহৃত হয়, তাই যতক্ষণ স্বচ্ছতা চান ততক্ষণ এটি কোনও রঙ হতে পারে।
অ্যান্টনি ম্যাটাক্স

4
এটি এখন এক্সকোড 7.3 (7D175) এর সাথে কাজ করে! যদিও গৃহীত উত্তরটি একটি খুব স্বজ্ঞাত কাজ, তবে আমি পরিবর্তে এই উত্তরটি পছন্দ করি।
এনস্টেইন

43

স্টোরিবোর্ডে বা এক্সআইবিতে ইউআইআইমেজভিউয়ের সাথে টেমপ্লেট রেন্ডারিং মোড ব্যবহার করা আইওএস 7 এবং আইওএস 8 উভয়ই খুব বগিযুক্ত।

আইওএস 7 এ

ইউআইআইজেজ স্টোরিবোর্ড / এক্সবি থেকে সঠিকভাবে ডিকোড হয় না। আপনি যদি পদ্ধতিটিতে imageView.image.renderingModeসম্পত্তিটি পরিদর্শন করেন তবে আপনি viewDidLoadখেয়াল করবেন যে এটি সর্বদা UIImageRenderingModeAutomatic, এমনকি যদি আপনি এটি আপনার xcassets ফাইলে টেম্পলেট চিত্র হিসাবে রেন্ডার হিসাবে সেট করেন ।

একযোগে কাজ করতে আপনাকে নিজেই রেন্ডারিং মোডটি সেট করতে হবে:

self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

আইওএস 8 এ

ইউআইআইজেজটি সঠিকভাবে ডিকোড করা হয়েছে এবং এর renderingModeবৈশিষ্ট্যটি প্রতিবিম্বিত করে যা এক্সক্যাসেট ফাইলে বেছে নেওয়া হয়েছিল তবে চিত্রটি রঙিন নয়।

একযোগে কাজ করতে আপনার কাছে দুটি বিকল্প রয়েছে:

  1. বৈশিষ্ট্য পরিদর্শক ফলকের পরিবর্তে ব্যবহারকারী নির্ধারিত রানটাইম বৈশিষ্ট্যগুলিতেtintColor সম্পত্তি সেট করুন ।

বা

  1. ম্যানুয়ালি টিন্ট কালার রিসেট করুন:
UIColor *tintColor = self.imageView.tintColor;
self.imageView.tintColor = nil;
self.imageView.tintColor = tintColor;

আপনি আপনার পছন্দসই বিকল্পটি চয়ন করতে পারেন, উভয়ই চিত্রটিকে সঠিকভাবে আঁকুন।

(আপনি যদি এক্সকোড .2.২ নিয়ে সংকলন self.imageView.tintColor = self.imageView.tintColor;করে থাকেন তবে কেবল করা যথেষ্ট হয়েছে তবে আপনি যদি এক্সকোড .3.৩ সহ সংকলন করছেন তবে এটি আর কাজ করে না)

উপসংহার

আপনার যদি আইওএস 7 এবং আইওএস 8 উভয়ই সমর্থন করার প্রয়োজন হয় তবে আপনার উভয় কার্যকার্য প্রয়োজন। আপনার যদি কেবল আইওএস 8 সমর্থন করতে হয় তবে কেবলমাত্র একটি কাজের প্রয়োজন।


4
ধন্যবাদ
এক্সকোড

4
আমি নিশ্চিত করেছিলাম যে আইওএস 8 এর জন্য কাজটি আইওএস 9 এর জন্যও অপরিবর্তনীয়
মাইকেল পিরোট

4
আমি অবশ্যই এক্সকোড 7 এ একই জিনিসটি দেখছি - ব্যবহারকারীর বৈশিষ্ট্যটি ভাল ছিল। ধন্যবাদ!
জেফ্রি ওয়াইজম্যান

জাগ্রতভাবে টিন্ট কালারটিকে ম্যানুয়ালি পুনরায় সেট করা থেকে ফর্মনিব এটি করেছে! (চিত্রটি .xcassets ক্যাটালগেও টেম্পলেটটিতে সেট করা হয়েছিল, অন্যথায় আপনাকে মূল থেকে কোনও টেম্পলেট চিত্র তৈরি করতে হবে)। ধন্যবাদ !!
অশ্বারোহী 7

15

স্টোরিবোর্ডে রঙিন রঙটি ব্যবহার করতে চিত্রভিউ রেন্ডারিংমড সেট করা ওয়ান-লাইনারে হ্রাস করা যেতে পারে:

[self.imageView setImage:[self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];

তারপরে চিত্র এবং রঙিন রঙের সবগুলি স্টোরিবোর্ডে সেট করা যেতে পারে।


13

আপনি এক্সটেনশন দিয়ে .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 বছরের মতো প্রায় হয়েছে।


4
এটি উত্তর হিসাবে নির্বাচন করা উচিত
farzadshbfn

তবুও একটি বাগ এবং এটি এখনও এটি আইওএস 12.0 হিসাবে ঠিক করেছে fix
স্যাম সোফেস 22:58

আইওএস 12.1 এ এখনও একটি বাগ
সিজারে

অবাস্তব ছেলেরা, অবাস্তব।
মাদুর

8

আপনি সেট সূত্র 't renderingModeপারেন থেকে storyboardবা xib। এটি প্রোগ্রামগতভাবে অ্যাক্সেস করতে পারে।

প্রাক্তন:

UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

4
আমি মনে করি, আপনি আপনার কোডটিতে ছোট টাইপগুলি তৈরি করেছেন। দ্বিতীয় লাইনটি হওয়া উচিতUIImage *selectedImage = [unSeletedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
আর্টেম স্টেপেনেনকো

8

স্টোরিবোর্ডে টিন্ট কালার এবং ক্লাস সেট করুন।

//
//  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
    }

}

এটিই নতুন উত্তর যা নতুন গতিতে কাজ করেছিল। ধন্যবাদ.
সাইমন মোশেনকো

কিছু অদ্ভুত কারণে আমার জন্য কাজ করে না ... স্টোরিবোর্ডে রঙটি আপডেট করার কথা কি?
সিজারে

4

এটি ঠিক করা খুব সহজ

কেবল ক্লাস ইউআইআইমেজভিউপিডিএফ তৈরি করুন এবং এটি আপনার স্টোরিবোর্ডে ব্যবহার করুন

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

3

আরেকটি সমাধান হ'ল একটি UIImageViewসাবক্লাস তৈরি করা :

final class TemplateImageView: UIImageView {
    override func awakeFromNib() {
        super.awakeFromNib()
        guard let oldImage = image else { return }
        image = nil
        image = oldImage.withRenderingMode(.alwaysTemplate)
    }
}

তারপরে কেবল ইন্টারফেস বিল্ডারে ক্লাস সেট করুন TemplateImageView


সেরা সমাধান !!
ইরশাদ মোহাম্মদ

2

স্টোরিবোর্ড থেকে সেট করার সহজ উপায়:

@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 এ সূক্ষ্মভাবে কাজ করে


1

আইওএস 9 tintColorএ ইন্টারফেস বিল্ডারে সম্পত্তি সেট করা এখনও বগি।

নোট করুন যে সরাসরি ImageViewবৈশিষ্ট্য সংশোধন করে রেখাগুলি লেখার পাশাপাশি একটি কার্যক্ষম সমাধান হ'ল সম্পদ ক্যাটালগটিতে রেন্ডার হিসাবে: টেম্পলেট চিত্র সেট করা এবং উদাহরণস্বরূপ কল করুন:

[[UIImageView appearanceWhenContainedInInstancesOfClasses:@[[MyView class]]] setTintColor:[UIColor whiteColor]];

1

tintColorইন্টারফেস বিল্ডারে রানটাইম বৈশিষ্ট্য যুক্ত করে আমি এই সমস্যাটি ঠিক করেছি ।

দ্রষ্টব্য: আপনার চিত্রগুলি আপনার চিত্রগুলি .xcassets ফাইলটিতে একটি টেম্পলেট চিত্র হিসাবে রেন্ডার করার জন্য এখনও আপনার চিত্রটি সেট করতে হবে।

এখানে চিত্র বর্ণনা লিখুন


0

যদি আপনি একটি আইবিউটলেট তৈরি করেন তবে আপনি নিজের জাগ্রত থেকে এটি পরিবর্তন করতে পারেন যেমন থেকে ...

self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

যদিও @ মবির উত্তরটি আরও সঠিক - এটি আরও সংহত হতে পারে।


4
প্রশ্নটি কোডে নয় স্টোরিবোর্ডে (বা xib) কীভাবে করা যায় তা ছিল।
আর্টেম স্টেপেনেনকো

@ আর্টেম - হ্যাঁ, দুঃখিত, আমি অনুধাবন করার অর্থ ছিল না আমার কাছে আপনার প্রশ্নের উত্তর ছিল। আইবিউউটলেটের মাধ্যমে কেবল এর সাথে মোকাবিলার একটি সহজ উপায়টি উল্লেখ করা হচ্ছে
আমেরিকান

0

ক্রেজি এই বাগটি এখনও আইওএস 12.1 এ রয়েছে! স্টোরিবোর্ড / এক্সিবসের জন্য: ইউআইআইমেজভিউতে একটি ট্যাগ যুক্ত করা দ্রুত সমাধান হতে পারে।

সুইফট 4.2

view.viewWithTag(1)?.tintColorDidChange()

0
extension UIImageView {

   @IBInspectable var renderModeTemplate : Bool {
       get{
           return image?.renderingMode == .alwaysTemplate
       }

       set{
          image = image?.withRenderingMode(newValue ? .alwaysTemplate:.alwaysOriginal)
       }
   }
}

স্টোরিবোর্ড নির্বাচন UIImageView এবং নির্বাচন পরিদর্শক, সেট সম্পত্তি renderModeTemplate= On সালে স্টোরিবোর্ড


0

রুডলফ এছাড়াও উল্লেখ করা হয়েছে উপরে , আমি একটি সহজ বর্গ, ভালো সংজ্ঞায়িত হবে:

import UIKit

@IBDesignable class TintImage: UIImageView{
    override func layoutSubviews() {
        super.layoutSubviews()
 
        image = image?.withRenderingMode(.alwaysTemplate)
    }
}

এই সংজ্ঞার পরে, কেবল স্টোরিবোর্ডে একটি চিত্র ভিউ যুক্ত করুন এবং এর নিজস্ব কাস্টম শ্রেণী নির্বাচন করুন TintImage। এটি স্টোরিবোর্ডে "রঙ" নির্বাচন সক্রিয় করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.