আইওএস 13-তে কোনও ইউআইএসইগমেন্টেড কন্ট্রোলের অংশের রঙগুলি কীভাবে পরিবর্তন করবেন?


108

একজন UISegmentedControlআইওএস 13 একটি নতুন চেহারা আছে এবং বিদ্যমান কোড segmented নিয়ন্ত্রণ রঙের আর কাজ পরিবর্তন করতে তারা করেনি।

আইওএস 13 এর আগে আপনি সেট করতে পারতেন tintColorএবং সেটি সেগমেন্টেড কন্ট্রোলের চারপাশের সীমানা, বিভাগগুলির মধ্যে লাইন এবং নির্বাচিত বিভাগটির পটভূমির রঙের জন্য ব্যবহৃত হবে। তারপরে আপনি অগ্রভাগের রঙ বৈশিষ্ট্যটি ব্যবহার করে প্রতিটি বিভাগের শিরোনামের রঙ পরিবর্তন করতে পারেন titleTextAttributes

আইওএস 13 এর অধীনে, tintColorকিছুই করে না। আপনি বিভাগযুক্ত নিয়ন্ত্রণ সেট করতে পারেনbackgroundColor সামগ্রিক রঙ পরিবর্তন করতে । তবে নির্বাচিত বিভাগটির ব্যাকগ্রাউন্ড হিসাবে ব্যবহৃত রঙটি পরিবর্তন করার কোনও উপায় আমি খুঁজে পাচ্ছি না। পাঠ্য বৈশিষ্ট্য নির্ধারণ এখনও কাজ করে। এমনকি আমি শিরোনামের পটভূমি রঙ সেট করার চেষ্টা করেছি কিন্তু এটি কেবল শিরোনামের পটভূমিকেই প্রভাবিত করে, নির্বাচিত বিভাগের বাকী ব্যাকগ্রাউন্ডের রঙকে নয়।

সংক্ষেপে, আপনি কীভাবে UISegmentedControlআইওএস 13 এ বর্তমানে নির্বাচিত বিভাগের পটভূমির রঙ পরিবর্তন করতে পারেন ? পাবলিক এপিআই ব্যবহার করে কি কোনও উপযুক্ত সমাধান রয়েছে, যার জন্য ব্যক্তিগত সাবউভিউ কাঠামোটিতে খননের প্রয়োজন নেই?

আইওএস 13 তে নতুন কোনও সম্পত্তি নেই UISegmentedControlবা UIControlএর কোনও পরিবর্তনই UIViewপ্রাসঙ্গিক নয়।

উত্তর:


133

আইওএস 13 বি 3 হিসাবে এখন একটি selectedSegmentTintColorচালু আছে UISegmentedControl

বিভাগের নিয়ন্ত্রণের সামগ্রিক রঙ পরিবর্তন করতে এটি ব্যবহার করুন backgroundColor

নির্বাচিত বিভাগটির ব্যবহারের রঙ পরিবর্তন করতে selectedSegmentTintColor

অনির্বাচিত সেগমেন্ট শিরোনাম রং / ফন্ট, ব্যবহার পরিবর্তন করতে setTitleTextAttributesএকটি রাষ্ট্র সঙ্গে .normal/ UIControlStateNormal

নির্বাচিত বিভাগের শিরোনামগুলির রঙ / ফন্ট পরিবর্তন করতে setTitleTextAttributes, .selected/ এর একটি রাজ্য সহ ব্যবহার করুন UIControlStateSelected

আপনি যদি চিত্রগুলির সাথে একটি বিভাগযুক্ত নিয়ন্ত্রণ তৈরি করেন, যদি চিত্রগুলি টেমপ্লেট চিত্র হিসাবে তৈরি করা হয়, তবে বিভাগগুলি নিয়ন্ত্রণগুলি tintColorচিত্রগুলি রঙ করার জন্য ব্যবহৃত হবে। তবে এটি একটি সমস্যা আছে। আপনি যদি tintColorএকই রঙে সেট করেন selectedSegmentTintColorতবে চিত্রটি নির্বাচিত বিভাগে দৃশ্যমান হবে না। আপনি যদি tintColorএকই রঙটিতে সেট করেন backgroundColorতবে অনির্বাচিত অংশগুলিতে চিত্রগুলি দৃশ্যমান হবে না। এর অর্থ চিত্রগুলির সাথে আপনার বিভাগিত নিয়ন্ত্রণে দৃশ্যমান হওয়ার জন্য অবশ্যই 3 টি পৃথক রঙ ব্যবহার করা উচিত। অথবা আপনি অ-টেম্পলেট চিত্র ব্যবহার করতে পারেন এবং সেট না করেtintColor

আইওএস 12 বা তারও বেশি আগে, কেবলমাত্র সেগমেন্টেড নিয়ন্ত্রণগুলি সেট করুন tintColorবা অ্যাপ্লিকেশনটির সামগ্রিক রঙের রঙের উপর নির্ভর করুন।


সীমানা ছাড়াই আমরা কীভাবে বিভাগটি নিয়ামক সেট করব? আমি আইওএস 13 এ এর ​​জন্য কোনও সেটিংস দেখছি না Earlier এর আগে, সীমান্তহীন বিভাগের নিয়ন্ত্রণ পাওয়ার জন্য টিন্টকালার সেট করা যথেষ্ট ছিল।
দীপক শর্মা

দয়া করে সীমানার রঙ ইত্যাদি যুক্ত করুন যাতে সমস্ত রঙ বিভাগ সম্পর্কিত সমস্যাগুলি সমাধান করতে পারে। কি বলে? :)
যোগেশ প্যাটেল

1
@ যোগেশপ্যাটেল সীমানা রঙ সম্পর্কে কী? আইওএস 13 এবং আইওএস 12 এ কোনও সীমানার রঙ নেই tintColorযা এটি ইতিমধ্যে উত্তরে .াকা রয়েছে।
rddy

@ আরমডি আমি এটি সেট করে রেখেছি [সেগমেন্টেড কন্ট্রোল.লায়ার সেটবোর্ডার কালার: [[ইউআইসিওলোর হোয়াইট কালার] সিজি কালার]]; [সেগমেন্টডকন্ট্রোল.লেয়ার সেটবোর্ডার প্রস্থ: 0.5]; এটা আমার সীমানা এবং সীমানার রঙ আইওএস 13. দেয়
যোগেশ প্যাটেলের

1
ওহ, এই সীমানা। এটি যে কোনও দৃশ্যে প্রযোজ্য, কেবলমাত্র একটি খণ্ডিত নিয়ন্ত্রণ নয়। এটি মূল প্রশ্নের ক্ষেত্র এবং এই উত্তরের বাইরে। আপনার মন্তব্য যথেষ্ট।
rmaddy

47

এক্সকোড 11 বিটা 3 হিসাবে

selectedSegmentTintColorসম্পত্তি এখন আছে UISegmentedControl

দেখুন rmaddy এর উত্তর


আইওএস 12 উপস্থিতি ফিরে পেতে

আমি নির্বাচিত বিভাগটির রঙিন রঙিন করতে পারিনি, আশা করি এটি একটি আসন্ন বিটাতে ঠিক হয়ে যাবে।

নির্বাচিত রাজ্যের ব্যাকগ্রাউন্ড চিত্র সেট করা স্বাভাবিক অবস্থার ব্যাকগ্রাউন্ড চিত্র সেট না করে কাজ করে না (যা সমস্ত আইওএস 13 স্টাইলিং সরিয়ে দেয়)

তবে আমি এটিকে আইওএস 12 উপস্থিতিতে ফিরিয়ে আনতে সক্ষম হয়েছি (বা প্রায় পর্যায়ে আমি কোণার ব্যাসার্ধটিকে এর ছোট আকারে ফিরিয়ে দিতে সক্ষম হইনি)।

এটি আদর্শ নয়, তবে একটি উজ্জ্বল সাদা অংশবিশেষ নিয়ন্ত্রণ আমাদের অ্যাপ্লিকেশনটিতে কিছুটা বাহ্যিক দেখায়।

(বুঝতে পারি নি যে UIImage(color:)আমাদের কোডবেসে একটি এক্সটেনশন পদ্ধতি ছিল But তবে এটি কার্যকর করার কোডটি ওয়েবে রয়েছে)

extension UISegmentedControl {
    /// Tint color doesn't have any effect on iOS 13.
    func ensureiOS12Style() {
        if #available(iOS 13, *) {
            let tintColorImage = UIImage(color: tintColor)
            // Must set the background image for normal to something (even clear) else the rest won't work
            setBackgroundImage(UIImage(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
            setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
            setBackgroundImage(UIImage(color: tintColor.withAlphaComponent(0.2)), for: .highlighted, barMetrics: .default)
            setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
            setTitleTextAttributes([.foregroundColor: tintColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)
            setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
            layer.borderWidth = 1
            layer.borderColor = tintColor.cgColor
        }
    }
}

উপরের কোডটির প্রভাব দেখাচ্ছে চিত্র


এটি একটি ভাল কাজ হতে পারে। আমি এখনও এটি চেষ্টা করার সুযোগ পাইনি setTitleTextAttributesতবে নির্বাচিত বিভাগটির শিরোনামটি সাদা রঙ করতে এটির কি একটি কল প্রয়োজন ?
rmaddy

হুম, দেখে মনে হচ্ছে এটি দেখতে হবে তবে মনে হচ্ছে না। আমি সেই কোড ব্যবহার এটিএমটিতে অ্যাক্সেস পাইনি, তবে বাম দিকের চিত্রটি সেই কোড দিয়ে তৈরি করা হয়েছে।
জোনাথন

8
stackoverflow.com/a/33675160/5790492 UIImage জন্য (রঙ :) এক্সটেনশান।
নিক কোভ

1
এটা চমৎকার যদি আপনি UIImage এক্সটেনশন, এই ভাবে যোগ হবে হবে, আপনার উত্তর সম্পূর্ণ iho হয়
FredFlinstone

1
@ ভিটিয়াশুরাপভ যখন এটি উভয়ই হাইলাইট এবং নির্বাচিত হয়েছে তখন এটি সেট করার জন্য এটি সেট করা রাষ্ট্রগুলির একটি বিন্যাস নয় বরং একটি বিকল্প সেট, যার অর্থ মানগুলি একটি নতুন রাষ্ট্র গঠনের জন্য একত্রিত হয়।
জোনাথন

36

আইওএস 13 এবং সুইফ্ট 5.0 (এক্সকোড 11.0) বিভাগের নিয়ন্ত্রণ 100% কাজ করছে

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

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

 if #available(iOS 13.0, *) {
      yoursegmentedControl.backgroundColor = UIColor.black
      yoursegmentedControl.layer.borderColor = UIColor.white.cgColor
      yoursegmentedControl.selectedSegmentTintColor = UIColor.white
      yoursegmentedControl.layer.borderWidth = 1

      let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]    
      yoursegmentedControl.setTitleTextAttributes(titleTextAttributes, for:.normal)

      let titleTextAttributes1 = [NSAttributedString.Key.foregroundColor: UIColor.black]
      yoursegmentedControl.setTitleTextAttributes(titleTextAttributes1, for:.selected)
  } else {
              // Fallback on earlier versions
}

7
আপনি কি সাদা হিসাবে ব্যাকগ্রাউন্ড সেট করার চেষ্টা করেছিলেন? আমার জন্য এটি
গ্রেইশ

@ ইত্তানহান্ট আপনি কোন এক্সকোড এবং সুইফট ভাষাটি ব্যবহার করছেন?
মৌলিক প্যাটেল

@ রনিত অফ কোর্স !! আমি চেষ্টা করব তবে প্লিজ আমাকে বলুন এখন কী ধরণের আউটপুট ডিসপ্লে হবে
মৌলিক প্যাটেল

সুইফট 5, এক্সকোড 11.3! এটি কি চায় তা দেখায়! আমি যা চাই তা নয় :)
Itan Hant

15

আমি একযোগে চেষ্টা করেছি এবং এটি আমার পক্ষে দুর্দান্ত কাজ করে। এখানে উদ্দেশ্য-সি সংস্করণটি রয়েছে:

@interface UISegmentedControl (Common)
- (void)ensureiOS12Style;
@end
@implementation UISegmentedControl (Common)
- (void)ensureiOS12Style {
    // UISegmentedControl has changed in iOS 13 and setting the tint
    // color now has no effect.
    if (@available(iOS 13, *)) {
        UIColor *tintColor = [self tintColor];
        UIImage *tintColorImage = [self imageWithColor:tintColor];
        // Must set the background image for normal to something (even clear) else the rest won't work
        [self setBackgroundImage:[self imageWithColor:self.backgroundColor ? self.backgroundColor : [UIColor clearColor]] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        [self setBackgroundImage:tintColorImage forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
        [self setBackgroundImage:[self imageWithColor:[tintColor colorWithAlphaComponent:0.2]] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
        [self setBackgroundImage:tintColorImage forState:UIControlStateSelected|UIControlStateSelected barMetrics:UIBarMetricsDefault];
        [self setTitleTextAttributes:@{NSForegroundColorAttributeName: tintColor, NSFontAttributeName: [UIFont systemFontOfSize:13]} forState:UIControlStateNormal];
        [self setDividerImage:tintColorImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        self.layer.borderWidth = 1;
        self.layer.borderColor = [tintColor CGColor];
    }
}

- (UIImage *)imageWithColor: (UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return theImage;
}
@end

2
আমি নিশ্চিত নই যে এটির সাথে এটি কাজ করবে CGRectMake(0.0f, 0.0f, 1.0f, 1.0f): এক্সকোড 11 বিটার সাথে আমার পরীক্ষাগুলি থেকে rectসেগমেন্টেড কন্ট্রোলের সীমানা হিসাবে একই আকার হওয়া উচিত।
সিউর

2
যেহেতু আইওএস 13 বিটা 6 টি নির্বাচিত বোতামটিতে টিন্টকলার প্রদর্শিত হয়নি, তাই আমাকে একটি লাইন যুক্ত করতে হয়েছিল: [সেলফিটগ্রাউন্ডকালারঅ্যাট্রিবিউটনাম: ইউআইসিওলর.ব্ল্যাককালার, এনএসফন্টআ্যাট্রিবিউটনাম: [ইউআইফন্ট সিস্টেমফন্টঅ্যাটসেট: 13]
পিটার জনসন

যখন আমি এটি ব্যবহার করার চেষ্টা করি তখন আমি [[UISegmentedControl appearance] ensureiOS12Style]একটি ব্যতিক্রম পাই। কি হচ্ছে কোনো ধারনা আছে? Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
জেরেমি হিক্স

13

এক্সকোড 11 বিটা 3 হিসাবে

selectedSegmentTintColorসম্পত্তি এখন আছে UISegmentedControl

ধন্যবাদ @ আরমডি!


আসল উত্তর, এক্সকোড 11 বিটা এবং বিটা 2 এর জন্য

পাবলিক এপিআই ব্যবহার করে কি কোনও উপযুক্ত সমাধান রয়েছে, যার জন্য ব্যক্তিগত সাবউভিউ কাঠামোটিতে খননের প্রয়োজন নেই?

এক্সকোড ১১.০ বিটা দিয়ে এটি নিয়ম অনুসারে করা একটি চ্যালেঞ্জ বলে মনে হচ্ছে, কারণ এটির মূলত প্রতিটি রাজ্যের জন্য সমস্ত পটভূমি চিত্রগুলি নিজের দ্বারা, গোলাকার, স্বচ্ছতা এবং সাথে পুনরায় চিত্রিত করা দরকার resizableImage(withCapInsets:)। উদাহরণস্বরূপ, আপনার অনুরূপ রঙিন চিত্র উত্পন্ন করতে হবে:
এখানে চিত্র বর্ণনা লিখুন

সুতরাং আপাতত আসুন, আসুন-উপ-দর্শনাগুলির উপায়টি খনন করা খুব সহজ বলে মনে হচ্ছে:

class TintedSegmentedControl: UISegmentedControl {

    override func layoutSubviews() {
        super.layoutSubviews()

        if #available(iOS 13.0, *) {
            for subview in subviews {
                if let selectedImageView = subview.subviews.last(where: { $0 is UIImageView }) as? UIImageView,
                    let image = selectedImageView.image {
                    selectedImageView.image = image.withRenderingMode(.alwaysTemplate)
                    break
                }
            }
        }
    }
}

এই সমাধানটি সঠিকভাবে নির্বাচনের জন্য রঙের রঙ প্রয়োগ করবে: এখানে চিত্র বর্ণনা লিখুন


1
পুরষ্কার দেওয়া হয়েছে কারণ সময়টি শেষ হয়ে গেছে, তবে সম্ভবত এমন একটি সমাধান পাওয়া যাবে যা ব্যক্তিগত শ্রেণিবদ্ধে খনন জড়িত না :)
জনাথন।

@Jonathan। ধন্যবাদ. আপনি ইতিমধ্যে পেয়েছি নিকটতম সমাধান অনুক্রমের দিকে তাকিয়ে জড়িত না: একবার আপনি কারণ setBackgroundImageজন্য .normal, আপনি (অন্যান্য রাজ্য এবং সহ অন্যান্য সকল চিত্র সেট করতে setDividerImageসম্ভবত কিছু), UIBezierPathএবং resizableImage(withCapInsets:)যার ফলে এটি মাত্রাতিরিক্ত জটিল করে তোলে যদি আমরা চাই আইওএস 13 নকশা, এই পথে.
Cœur

হ্যাঁ, আদর্শভাবে এটি একটি বিটাতে ঠিক করা হবে
জনাথন।

3
আইওএস 13 বি 3 এর মতো এটি আর দরকার নেই। selectedSegmentTintColorসম্পত্তি এখন আছে UISegmentedControl
rmaddy

11

@ ইলাহী চরফিডাইন উত্তরের সুইফট সংস্করণ:

if #available(iOS 13.0, *) {
   segmentedControl.setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
   segmentedControl.selectedSegmentTintColor = UIColor.blue
} else {
   segmentedControl.tintColor = UIColor.blue
}

10
if (@available(iOS 13.0, *)) {

    [self.segmentedControl setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont systemFontOfSize:13]} forState:UIControlStateSelected];
    [self.segmentedControl setSelectedSegmentTintColor:[UIColor blueColor]];

} else {

[self.segmentedControl setTintColor:[UIColor blueColor]];}

7

আইওএস 13 ইউআইজিগমেন্ট কন্ট্রোলার

ব্যবহারবিধি:

segment.setOldLayout(tintColor: .green)

extension UISegmentedControl
{
    func setOldLayout(tintColor: UIColor)
    {
        if #available(iOS 13, *)
        {
            let bg = UIImage(color: .clear, size: CGSize(width: 1, height: 32))
             let devider = UIImage(color: tintColor, size: CGSize(width: 1, height: 32))

             //set background images
             self.setBackgroundImage(bg, for: .normal, barMetrics: .default)
             self.setBackgroundImage(devider, for: .selected, barMetrics: .default)

             //set divider color
             self.setDividerImage(devider, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)

             //set border
             self.layer.borderWidth = 1
             self.layer.borderColor = tintColor.cgColor

             //set label color
             self.setTitleTextAttributes([.foregroundColor: tintColor], for: .normal)
             self.setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
        }
        else
        {
            self.tintColor = tintColor
        }
    }
}
extension UIImage {
    convenience init(color: UIColor, size: CGSize) {
        UIGraphicsBeginImageContextWithOptions(size, false, 1)
        color.set()
        let ctx = UIGraphicsGetCurrentContext()!
        ctx.fill(CGRect(origin: .zero, size: size))
        let image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        self.init(data: image.pngData()!)!
    }
}

1
এটিই আমার পক্ষে কাজ করেছে - পটভূমির চিত্রগুলি। নির্বাচিত সেগমেন্টটাইন্টকলার কোনও কারণে কাজ করেনি।
ডেনউকেম

7

এক্সকোডি 11.1 এবং আইওএস 13

@ জিগার দারজি'র জবাবের ভিত্তিতে তবে একটি নিরাপদ বাস্তবায়ন।

আমরা প্রথমে একটি অনুপযুক্ত সুবিধামত প্রাথমিক:

extension UIImage {

convenience init?(color: UIColor, size: CGSize) {
    UIGraphicsBeginImageContextWithOptions(size, false, 1)
    color.set()
    guard let ctx = UIGraphicsGetCurrentContext() else { return nil }
    ctx.fill(CGRect(origin: .zero, size: size))
    guard
        let image = UIGraphicsGetImageFromCurrentImageContext(),
        let imagePNGData = image.pngData()
        else { return nil }
    UIGraphicsEndImageContext()

    self.init(data: imagePNGData)
   }
}

তারপরে আমরা UISegmentedControl প্রসারিত করি:

extension UISegmentedControl {

func fallBackToPreIOS13Layout(using tintColor: UIColor) {
    if #available(iOS 13, *) {
        let backGroundImage = UIImage(color: .clear, size: CGSize(width: 1, height: 32))
        let dividerImage = UIImage(color: tintColor, size: CGSize(width: 1, height: 32))

        setBackgroundImage(backGroundImage, for: .normal, barMetrics: .default)
        setBackgroundImage(dividerImage, for: .selected, barMetrics: .default)

        setDividerImage(dividerImage,
                        forLeftSegmentState: .normal,
                        rightSegmentState: .normal, barMetrics: .default)

        layer.borderWidth = 1
        layer.borderColor = tintColor.cgColor

        setTitleTextAttributes([.foregroundColor: tintColor], for: .normal)
        setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
    } else {
        self.tintColor = tintColor
    }
  }
}

পারফেক্ট! ধন্যবাদ!
সেনোকিকো স্টেলিয়ান

5

জনাথন.আইওএস (সি #) এর জন্য জোনাথনের জবাবটি এখানে আমার দেওয়া, তবে চিত্র আকার দেওয়ার জন্য ঠিকঠাক সহ। কলিন ব্লেকের উত্তরের বিষয়ে কউরের মন্তব্যের সাথে আমি ভাগ করা কন্ট্রোলের আকারের বিভাজক বাদে সমস্ত চিত্র তৈরি করেছিলাম। বিভাগটির 1 ডিগ্রি বিভাজক।

public static UIImage ImageWithColor(UIColor color, CGSize size)
{
    var rect = new CGRect(0, 0, size.Width, size.Height);
    UIGraphics.BeginImageContext(rect.Size);
    var context = UIGraphics.GetCurrentContext();
    context.SetFillColor(color.CGColor);
    context.FillRect(rect);
    var image = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();
    return image;
}

// https://stackoverflow.com/a/56465501/420175
public static void ColorSegmentiOS13(UISegmentedControl uis, UIColor tintColor, UIColor textSelectedColor, UIColor textDeselectedColor)
{
    if (!UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
    {
        return;
    }

    UIImage image(UIColor color)
    {
        return ImageWithColor(color, uis.Frame.Size);
    }

    UIImage imageDivider(UIColor color)
    {
        return ImageWithColor(color, 1, uis.Frame.Height);
    }

    // Must set the background image for normal to something (even clear) else the rest won't work
    //setBackgroundImage(UIImage(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
    uis.SetBackgroundImage(image(UIColor.Clear), UIControlState.Normal, UIBarMetrics.Default);

    // setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
    uis.SetBackgroundImage(image(tintColor), UIControlState.Selected, UIBarMetrics.Default);

    // setBackgroundImage(UIImage(color: tintColor.withAlphaComponent(0.2)), for: .highlighted, barMetrics: .default)
    uis.SetBackgroundImage(image(tintColor.ColorWithAlpha(0.2f)), UIControlState.Highlighted, UIBarMetrics.Default);

    // setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
    uis.SetBackgroundImage(image(tintColor), UIControlState.Highlighted | UIControlState.Selected, UIBarMetrics.Default);

    // setTitleTextAttributes([.foregroundColor: tintColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)
    // Change: support distinct color for selected/de-selected; keep original font
    uis.SetTitleTextAttributes(new UITextAttributes() { TextColor = textDeselectedColor }, UIControlState.Normal); //Font = UIFont.SystemFontOfSize(13, UIFontWeight.Regular)
    uis.SetTitleTextAttributes(new UITextAttributes() { TextColor = textSelectedColor, }, UIControlState.Selected); //Font = UIFont.SystemFontOfSize(13, UIFontWeight.Regular)

    // setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
    uis.SetDividerImage(imageDivider(tintColor), UIControlState.Normal, UIControlState.Normal, UIBarMetrics.Default);

    //layer.borderWidth = 1
    uis.Layer.BorderWidth = 1;

    //layer.borderColor = tintColor.cgColor
    uis.Layer.BorderColor = tintColor.CGColor;
}

3

আপনি নিম্নলিখিত পদ্ধতিটি প্রয়োগ করতে পারেন

extension UISegmentedControl{
    func selectedSegmentTintColor(_ color: UIColor) {
        self.setTitleTextAttributes([.foregroundColor: color], for: .selected)
    }
    func unselectedSegmentTintColor(_ color: UIColor) {
        self.setTitleTextAttributes([.foregroundColor: color], for: .normal)
    }
}

ব্যবহারের কোড

segmentControl.unselectedSegmentTintColor(.white)
segmentControl.selectedSegmentTintColor(.black)

0

উপরের উত্তরগুলি দুর্দান্ত, তবে তাদের বেশিরভাগই নির্বাচিত বিভাগের ভিতরে থাকা পাঠ্যের রঙটি ভুল পান। আমি UISegmentedControlসাবক্লাস তৈরি করেছি যা আপনি আইওএস 13 এবং প্রাক আইওএস 13 ডিভাইসে ব্যবহার করতে পারবেন এবং টিন্টকলার সম্পত্তিটি আগের আইওএস 13 ডিভাইসে ব্যবহার করতে পারবেন।

    class LegacySegmentedControl: UISegmentedControl {
        private func stylize() {
            if #available(iOS 13.0, *) {
                selectedSegmentTintColor = tintColor
                let tintColorImage = UIImage(color: tintColor)
                setBackgroundImage(UIImage(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
                setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
                setBackgroundImage(UIImage(color: tintColor.withAlphaComponent(0.2)), for: .highlighted, barMetrics: .default)
                setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
                setTitleTextAttributes([.foregroundColor: tintColor!, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)

                setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
                layer.borderWidth = 1
                layer.borderColor = tintColor.cgColor

// Detect underlying backgroundColor so the text color will be properly matched

                if let background = backgroundColor {
                    self.setTitleTextAttributes([.foregroundColor: background, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .selected)
                } else {
                    func detectBackgroundColor(of view: UIView?) -> UIColor? {
                        guard let view = view else {
                            return nil
                        }
                        if let color = view.backgroundColor, color != .clear {
                            return color
                        }
                        return detectBackgroundColor(of: view.superview)
                    }
                    let textColor = detectBackgroundColor(of: self) ?? .black

                    self.setTitleTextAttributes([.foregroundColor: textColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .selected)
                }
            }
        }

        override func tintColorDidChange() {
            super.tintColorDidChange()
            stylize()
        }
    }

    fileprivate extension UIImage {
        public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
          let rect = CGRect(origin: .zero, size: size)
          UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
          color.setFill()
          UIRectFill(rect)
          let image = UIGraphicsGetImageFromCurrentImageContext()
          UIGraphicsEndImageContext()

          guard let cgImage = image?.cgImage else { return nil }
          self.init(cgImage: cgImage)
        }
    }

ব্যবহার tintColorDidChangeপদ্ধতি আমরা নিশ্চিত করি যে stylizeপদ্ধতিটি প্রতিবার ডাকা হবেtintColor বিভাগের ভিউতে সম্পত্তি পরিবর্তন হলে বা আইওএসের সাথে পছন্দসই আচরণের অন্তর্নিহিত যে কোনও ভিউ ।

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


-2

আপনি গোলাকার কোণগুলি না চান এমন ক্ষেত্রে জোনাথন উত্তরের উপর কিছুটা প্রসারিত করা

extension UISegmentedControl {
    /// Tint color doesn't have any effect on iOS 13.
    func ensureiOS12Style(roundCorner: Bool = true) {
        if #available(iOS 13, *) {
            let tintColorImage = UIImage(color: tintColor)
            // Must set the background image for normal to something (even clear) else the rest won't work
            setBackgroundImage(UIImage(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
            setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
            setBackgroundImage(UIImage(color: tintColor.withAlphaComponent(0.2)), for: .highlighted, barMetrics: .default)
            setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
            setTitleTextAttributes([.foregroundColor: tintColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)
            setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)

            if !roundCorner {
                layer.masksToBounds = false

                let borderView = UIView()
                borderView.layer.borderWidth = 1
                borderView.layer.borderColor = UIColor.black.cgColor
                borderView.isUserInteractionEnabled = false
                borderView.translatesAutoresizingMaskIntoConstraints = false

                addSubview(borderView)

                NSLayoutConstraint(item: borderView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0).isActive = true
                NSLayoutConstraint(item: borderView, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0).isActive = true
                NSLayoutConstraint(item: borderView, attribute: .width, relatedBy: .equal, toItem: self, attribute: .width, multiplier: 1, constant: 0).isActive = true
                NSLayoutConstraint(item: borderView, attribute: .height, relatedBy: .equal, toItem: self, attribute: .height, multiplier: 1, constant: 0).isActive = true
            }
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.