পছন্দসই স্ট্যাটাসবারস্টাইল বলা হয় না


257

আমি এই থ্রেডটিকে ওভাররাইড করার জন্য অনুসরণ করেছি -preferredStatusBarStyle, তবে এটি বলা হয় না। এটি সক্ষম করতে আমি যে কোনও বিকল্পগুলি পরিবর্তন করতে পারি? (আমি আমার প্রকল্পে XIBs ব্যবহার করছি।)


এটি কোন প্রসঙ্গে বলা হয় না: সিমুলেটার? একটি ডিভাইসে?
বিনে

@ দুজনে উভয়কেই
trgoofi

আপনি আইওএস 7 সিমুলেটর, একটি আইওএস 7 ডিভাইস এবং আপনার বেস এসডিকে 7.0 ব্যবহার করছেন?
বিনে

@Beely iOS SDK 7.0 আমার প্রকল্পের নামের নীচে দেখানো হচ্ছে, তার অর্থ কি আমার বেস এসডিকে 7.0?
trgoofi

বিল্ড সেটিংসে, "বেস এসডিকে" হ'ল মানটি সেট করা আছে। দেখে মনে হচ্ছে আপনার প্রকল্পটি 7.0 এ সেট করা আছে।
বিনে

উত্তর:


117

সম্ভাব্য মূল কারণ

আমারও একই সমস্যা ছিল এবং আমি বুঝতে পেরেছিলাম যে এটি ঘটছে কারণ আমি আমার অ্যাপ্লিকেশন উইন্ডোতে রুট ভিউ কন্ট্রোলার সেট করছি না।

UIViewControllerযা আমি বাস্তবায়িত করেছিলেন preferredStatusBarStyleএকটি ক্ষেত্রে ব্যবহার করা হয়েছিল UITabBarControllerযা পর্দায় দেখার চেহারা নিয়ন্ত্রিত।

আমি যখন এটি নির্দেশ করতে রুট ভিউ কন্ট্রোলার সেট করেছি, তখন UITabBarControllerপ্রত্যাশা অনুযায়ী স্ট্যাটাস বারের পরিবর্তনগুলি সঠিকভাবে কাজ শুরু করে (এবং preferredStatusBarStyleপদ্ধতিটি ডাকছিল)।

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ... // other view controller loading/setup code

    self.window.rootViewController = rootTabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

বিকল্প পদ্ধতি (আইওএস 9 এ হ্রাস করা)

বিকল্পভাবে, আপনি প্রতিটি ভিউ কন্ট্রোলারে যথাযথ হিসাবে যথাযথভাবে ব্যবহার করতে না গিয়ে তার পটভূমির রঙের উপর নির্ভর করে নীচের একটি পদ্ধতিতে কল করতে পারেন setNeedsStatusBarAppearanceUpdate:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

অথবা

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

মনে রাখবেন যে আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে প্লাস্ট ফাইলটিতেও আপনাকে সেট UIViewControllerBasedStatusBarAppearanceকরতে NOহবে।


2
আপনার মতো আমারও একই সমস্যা আছে, রুট ভিউ নিয়ামকটি সেট করে নেই। তুমি কীভাবে পেয়েছ?
trgoofi

1
আমার সন্দেহ হয়েছিল যে ফ্রেমওয়ার্কের কোনও কিছু থেকে বিজ্ঞপ্তি পাচ্ছে না setNeedsStatusBarAppearanceUpdate- আমি এই পরিবর্তনটি করার সময় আমার সন্দেহগুলি নিশ্চিত হয়েছিল।
আব্দুল্লাহি

2
সম্পর্কিত একটি সমস্যা যা আমি একটি অ্যাপ্লিকেশনটিতে পেয়েছি তা হল একটি পূর্ণ স্ক্রীন শিশু ভিউ কন্ট্রোলার সহ একটি ভিউ কন্ট্রোলার যা চাইল্ড ভিউ কনট্রোলারটিকে ফিরিয়ে আনতে চাইল্ডভিউ কনট্রোলারফোস্ট্যাটাসবারস্টাইল এবং চাইল্ডভিউ কনট্রোলারফোর্ডসটাসবারহিডনকে ওভাররাইড করে না। যদি আপনার নিজস্ব ভিউ নিয়ন্ত্রক শ্রেণিবিন্যাস থাকে তবে আপনাকে স্টেটাস বারের শৈলীর নির্ধারণ করতে কোন ভিউ কন্ট্রোলার ব্যবহার করা উচিত তা সিস্টেমকে অবহিত করার জন্য এই পদ্ধতিগুলি সরবরাহ করতে হবে।
জন স্টেইনমেটজ

রুটভিউ কনট্রোলার সেট করা কোনও পরিবর্তন করে না। আপনার জনের মন্তব্য নিয়ে কাজ করা উচিত। এবং setneedsstatusbarappearanceUpdate কল করার সময় সতর্কতা অবলম্বন করুন। কাজের জন্য পিতামাতার কাছ থেকে এটি কল করা উচিত।
doozMen

1
@ হিপ্পো আপনি মেধাবী !! আপনি কীভাবে আবিষ্কার করলেন যে এটি রুটভিউ নিয়ন্ত্রণকারীকে সেট না করার কারণে হয়েছিল?
ভিরুম্যাক্স

1019

ইউআইএনএভিগেশন নিয়ন্ত্রণকারী যে কারও জন্য:

UINavigationControllerএগিয়ে না preferredStatusBarStyleতার সন্তানের দৃশ্য কন্ট্রোলার কল। পরিবর্তে এটি তার নিজস্ব রাজ্য পরিচালনা করে - যেমনটি হওয়া উচিত, এটি পর্দার শীর্ষে অঙ্কিত হচ্ছে যেখানে স্ট্যাটাস বারটি বাস করে এবং তাই এর জন্যও দায়বদ্ধ হওয়া উচিত। এর preferredStatusBarStyleজন্য কোনও ন্যাভাল কন্ট্রোলারের মধ্যে আপনার ভিসিগুলিতে প্রয়োগ করার ফলে কিছুই করবে না - তাদের কখনই ডাকা হবে না।

কৌতুক কি UINavigationControllerকি জন্য ফিরে যাওয়ার সিদ্ধান্ত নিতে ব্যবহার UIStatusBarStyleDefaultবা UIStatusBarStyleLightContent। এটা তার উপর এই সেগুলো UINavigationBar.barStyle। ডিফল্ট ( UIBarStyleDefault) এর ফলে অন্ধকারের অগ্রভাগের UIStatusBarStyleDefaultস্থিতি দণ্ড in এবং UIBarStyleBlackএকটি UIStatusBarStyleLightContentস্ট্যাটাস বার দেবে।

টি এল; ডিআর:

যদি আপনি চান UIStatusBarStyleLightContentএকটি উপর UINavigationControllerব্যবহার:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

59
নিস! মনে রাখবেন যে preferredStatusBarStyleআপনি নেভিগেশন বারটি ঠিকঠাকভাবে (সেট navigationBarHiddenকরা YES) লুকিয়ে রাখলে প্রকৃতপক্ষে চাইল্ড ভিউ কন্ট্রোলারকে ডাকা হবে ।
প্যাট্রিক পিজনাপেল

25
এই উত্তরের জন্য ধন্যবাদ। আপনি যদি আপনার সমস্ত নেভিগেশন বারের জন্য বার স্টাইল সেট করতে চান তবে কল করুন[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
টমাস মরুভূমি

15
নিখুঁত উত্তর. এসও-তে থাকা অন্য কোনও উত্তরই ইউআইএনএভিগেশন কন্ট্রোলারকে বিবেচনায় নেয় নি। কীবোর্ডের বিপরীতে আমার মাথা ঘোরানোর 2 ঘন্টা।
রায়ান আলফোর্ড

10
কুতোস @ পেট্রিক থেকে নির্দেশিত যে navigationBarHiddenসেটটি YESআসলে preferredStatusBarStyleডেকেছে এবং এটিতে হোঁচট খেতে পারে তাদের জন্য একটি সতর্কতা: এটি কাজ করে navigationBarHiddenতবে সাথে নয় navigationBar.hidden!
jcaron

4
সুস্পষ্ট হওয়া উচিত, তবে এটিকে কাজ করার জন্য আপনার ইনফো.প্লেস্টে YES এ সেট করা "নিয়ন্ত্রক-ভিত্তিক স্ট্যাটাস বারের উপস্থিতি দেখুন" দরকার।
কোড বেলার

99

সুতরাং আমি আসলে ইউআইএনএভিগেশন কন্ট্রোলারটিতে একটি বিভাগ যুক্ত করেছি তবে পদ্ধতিগুলি ব্যবহার করেছি:

-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;

এবং সেইগুলি বর্তমান দৃশ্যমান ইউআইভিউউকন্ট্রোলারকে ফিরিয়ে দিয়েছে। এটি বর্তমান দৃশ্যমান দৃশ্যের নিয়ামককে নিজস্ব পছন্দসই স্টাইল / দৃশ্যমানতা সেট করতে দেয়।

এটির জন্য এখানে একটি সম্পূর্ণ কোড স্নিপেট রয়েছে:

সুইফটে:

extension UINavigationController {

    public override func childViewControllerForStatusBarHidden() -> UIViewController? {
        return self.topViewController
    }

    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return self.topViewController
    }
}

উদ্দেশ্য-সি:

@interface UINavigationController (StatusBarStyle)

@end

@implementation UINavigationController (StatusBarStyle)

-(UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

-(UIViewController *)childViewControllerForStatusBarHidden {
    return self.topViewController;
}

@end

এবং ভাল পরিমাপের জন্য, এটি এখানে কোনও ইউআইভিউউকন্ট্রোলারে কার্যকর হয় কীভাবে:

সুইফটে

override public func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}

override func prefersStatusBarHidden() -> Bool {
    return false
}

অবজেক্টিভ-সি তে

-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent; // your own style
}

- (BOOL)prefersStatusBarHidden {
    return NO; // your own visibility code
}

নিশ্চিত অবশেষে, করতে আপনার অ্যাপ plist নেই না "নিয়ামক ভিত্তিক স্ট্যাটাস বার চেহারা দেখুন" কোন তুলে দিয়েছ। হয় সেই লাইনটি মুছুন বা এটি হ্যাঁ সেট করুন (যা আমি বিশ্বাস করি যে iOS 7 এর জন্য এখন ডিফল্ট?)


দেখে মনে হচ্ছে return self.topViewController;আমার পক্ষে কাজ করে তবে return self.visibleViewController;- না
k06a

দৃশ্যত ভিউকন্ট্রোলার আপনি উপস্থাপনের সময় বর্তমানে উপস্থাপিত মডেল কন্ট্রোলারকে ফিরিয়ে দিতে পারেন। যা বোমার। টপভিউকন্ট্রোলার ব্যবহার করুন।
বেন সিনক্লেয়ার

1
@ ডি.লেবেদেভ ঠিক আছে, তবে আমি মনে করি না যে এই সমস্যাগুলির কোনওটিই এখানে প্রয়োগ হয়েছে। আপনাকে superএই পদ্ধতিতে কল করার দরকার নেই এবং আপনি আসলে এই ধরণের সমস্ত কন্ট্রোলারের আচরণ পরিবর্তন করতে চান
'

1
এটি আইওএস 9.3 এ আমার জন্য কাজ করছে না। আমার ধারণা, এটিই সমস্যা: এই সমস্যাটি বিশেষ তাত্পর্যপূর্ণ কারণ অনেকগুলি কোকো শ্রেণি বিভাগ ব্যবহার করে প্রয়োগ করা হয়। একটি কাঠামো-সংজ্ঞায়িত পদ্ধতি যা আপনি ওভাররাইড করার চেষ্টা করছেন তা নিজেই কোনও বিভাগে প্রয়োগ করা যেতে পারে এবং যার ফলে প্রয়োগটি অগ্রাধিকার গ্রহণ করে তা সংজ্ঞায়িত হয় না।
ভাইকিংগুন্ডো

2
এটি ভুল এবং এটি আইওএস 13.4 এ ব্রেক। কারণ সুইফটে অবজেক্টিভ সি ক্লাসগুলি প্রসারণ করা উদ্দেশ্য সি বিভাগগুলির মাধ্যমে প্রয়োগ করা হয়। অবজেক্টিভ সি বিভাগগুলির মাধ্যমে ওভাররাইডিং পদ্ধতিগুলি সুপারিশ করা হয় না এবং সম্ভবত এটির বিরতি ঘটে। স্ট্যাকওভারফ্লো.com
মার্ক এচেভারি

79

যে কেউ এখনও এর সাথে লড়াই করছেন, দ্রুতগতির এই সাধারণ বর্ধনের জন্য আপনার সমস্যার সমাধান করা উচিত।

extension UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
}

10
আপনি স্যার একটি পদক প্রাপ্য।
নিকানস

2
আপনাকে অনেক ধন্যবাদ মানুষ। আমি কোনও সাফল্য না দিয়ে দৃশ্যমান ভিউ কন্ট্রোলারকে ফিরে আসছিলাম।
ফ্যাবিও সালতা

1
এই সোনার। আমার একটি নেভিগেশন কন্ট্রোলার একটি ট্যাব বারে এম্বেড হয়েছে এবং আমি এটি কেবল একটি ফাইলে ফেলে দিয়েছি এবং এখন আমি যেখানেই চাই স্থিতি বারের উপস্থিতি পরিবর্তন করতে পারি।
ওয়াহিদ আমিরি

2
এটি ভুল এবং এটি আইওএস 13.4 এ ব্রেক। কারণ সুইফটে অবজেক্টিভ সি ক্লাসগুলি প্রসারণ করা উদ্দেশ্য সি বিভাগগুলির মাধ্যমে প্রয়োগ করা হয়। অবজেক্টিভ সি বিভাগগুলির মাধ্যমে ওভাররাইডিং পদ্ধতিগুলি সুপারিশ করা হয় না এবং সম্ভবত এটির বিরতি ঘটে। স্ট্যাকওভারফ্লো.com
মার্ক এচেভারি

1
এই বিশেষ উদাহরণটি ভুল ছিল না। বিষয়টির সত্যতা হ'ল ইউআইএনএভিগেশন কন্ট্রোলারের মতো অন্যান্য অবজেক্টস / প্রোটোকলের সাবক্লাসগুলির গতিশীল প্রেরণের বিরোধে এইগুলির পূর্বে কোনও প্রয়োগ ছিল না। প্রকৃত উপশ্রেণীর মধ্যে কোনও ডিফল্ট বা বাস্তবায়ন ছিল না, এজন্য অপ্রয়োজনীয় নির্ভরতা (সময়কাল) তৈরি না করেই কোনও অ্যাপ্লিকেশন জুড়ে এটি প্রয়োগের সবচেয়ে পরিষ্কার উপায়। দুর্ভাগ্যক্রমে, 13.4 এই আচরণটি পরিবর্তন করেছে বলে মনে হচ্ছে। আমি এখন তাদের চেক বা বাস্তবায়ন হয়েছে এমন দৃশ্যের পিছনে অনুমান করছি যা বছরের পর বছর অস্তিত্বহীন ছিল .........
TheCodingArt

20

আমার অ্যাপ্লিকেশানের সব তিনটি ব্যবহৃত: UINavigationController, UISplitViewController, UITabBarController, এইভাবে এই সব স্ট্যাটাস বার উপর নিয়ন্ত্রণ নিতে বলে মনে হচ্ছে এবং কারণ হবে preferedStatusBarStyleতাদের সন্তানদের জন্য বলা হয় না হবে। এই আচরণটি ওভাররাইড করতে আপনি বাকি উত্তরগুলির মতো একটি এক্সটেনশন তৈরি করতে পারেন। সুইফট ৪-এ তিনটির জন্য এখানে একটি বর্ধিতকরণ রয়েছে। আশা করি অ্যাপল এই ধরণের স্টাফ সম্পর্কে আরও পরিষ্কার ছিল।

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.topViewController
    }
}

extension UITabBarController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.childViewControllers.first
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.childViewControllers.first
    }
}

extension UISplitViewController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.childViewControllers.first
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.childViewControllers.first
    }
}

সম্পাদনা করুন: সুইফট ৪.২ এপিআই পরিবর্তনের জন্য আপডেট

extension UINavigationController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.topViewController
    }
}

extension UITabBarController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.children.first
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.children.first
    }
}

extension UISplitViewController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.children.first
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.children.first
    }
}

1
এটিই একমাত্র সমাধান যা কাজ করে। এসও-তে সমস্ত উত্তরগুলি স্ট্যান্ডার্ড সমাধানটিতে নির্দেশ করে যা নেভিগেশনকন্ট্রোলারগুলির সাথে কোনও অ্যাপ্লিকেশনের জন্য কাজ করবে না। ধন্যবাদ!!!
হিউম্যান

ওভাররাইডিংয়ের জন্য এক্সটেনশনগুলি ব্যবহার করা ভুল। এটি নিরাপদ নয়। একাধিক সহজ সমাধান আছে। পরিবর্তে একটি সাবক্লাস ব্যবহার করুন।
সুলতান

2
এটি ভুল এবং এটি আইওএস 13.4 এ ব্রেক। কারণ সুইফটে অবজেক্টিভ সি ক্লাসগুলি প্রসারণ করা উদ্দেশ্য সি বিভাগগুলির মাধ্যমে প্রয়োগ করা হয়। অবজেক্টিভ সি বিভাগগুলির মাধ্যমে ওভাররাইডিং পদ্ধতিগুলি সুপারিশ করা হয় না এবং সম্ভবত এটির বিরতি ঘটে। স্ট্যাকওভারফ্লো.com
মার্ক এচেভারি

1
এই বিশেষ উদাহরণটি ভুল ছিল না। বিষয়টির সত্যতা হ'ল ইউআইএনএভিগেশন কন্ট্রোলারের মতো অন্যান্য অবজেক্টস / প্রোটোকলের সাবক্লাসগুলির গতিশীল প্রেরণের বিরোধে এইগুলির পূর্বে কোনও প্রয়োগ ছিল না। প্রকৃত উপশ্রেণীর মধ্যে কোনও ডিফল্ট বা বাস্তবায়ন ছিল না, এজন্য অপ্রয়োজনীয় নির্ভরতা (সময়কাল) তৈরি না করেই কোনও অ্যাপ্লিকেশন জুড়ে এটি প্রয়োগের সবচেয়ে পরিষ্কার উপায়। দুর্ভাগ্যক্রমে, 13.4 এই আচরণটি পরিবর্তন করেছে বলে মনে হচ্ছে। আমি এখন তাদের চেক বা বাস্তবায়ন হয়েছে এমন দৃশ্যের পিছনে অনুমান করছি যা বছরের পর বছর অস্তিত্বহীন ছিল .........
TheCodingArt

15

স্ট্যাটাস বারের রঙ সাদা করে পরিবর্তনের জন্য টাইসনের উত্তর সঠিক UINavigationController

যদি কেউ কোডটি লিখে লিখে একই ফলাফলটি অর্জন করতে চায় AppDelegateতবে নীচের কোডটি ব্যবহার করুন এবং এটি AppDelegate's didFinishLaunchingWithOptionsপদ্ধতিতে লিখুন ।

আর সেট করতে ভুলবেন না UIViewControllerBasedStatusBarAppearanceকরতে YES.plist ফাইলে অন্য পরিবর্তন প্রতিফলিত করা হবে না।

কোড

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     // status bar appearance code
     [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

     return YES;
}

14

একটি ইউআইএনএভিগেশন কন্ট্রোলার এ preferredStatusBarStyleবলা হয় না কারণ এটির topViewControllerপক্ষে অগ্রাধিকার দেওয়া হয় self। সুতরাং, preferredStatusBarStyleকোনও ইউআইএনএভিগেশন কন্ট্রোলারের সাথে যোগাযোগ করার জন্য আপনাকে এটি পরিবর্তন করতে হবে childViewControllerForStatusBarStyle

সুপারিশ

আপনার শ্রেণিতে আপনার ইউআইএনএভিগেশন নিয়ন্ত্রণকারীকে ওভাররাইড করুন:

class MyRootNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}

অ প্রস্তাবিত বিকল্প

সমস্ত ইউআইএনএভিগেশন কন্ট্রোলারের জন্য এটি করতে আপনি কোনও এক্সটেনশনে ওভাররাইড করতে পারেন (সতর্কতা: এটি ইউআইডোকামেন্টপিকারভিউ কনট্রোলার, ইউআইআইমেজপিকার কনট্রোলার ইত্যাদি প্রভাবিত করে) তবে আপনি সম্ভবত সুইফ্ট ডকুমেন্টেশন অনুযায়ী এটি করবেন না :

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}

11

সেরেনের উত্তর ছাড়াও, যদি আপনি একটি modalPresentationStyle(উদাহরণস্বরূপ .overCurrentContext) দিয়ে একটি ভিউ কন্ট্রোলার উপস্থাপন করেন তবে আপনাকে নতুন উপস্থাপিত ভিউ কন্ট্রোলারের সাথেও এটি কল করা উচিত:

presentedViewController.modalPresentationCapturesStatusBarAppearance = true

preferredStatusBarStyleউপস্থাপিত ভিউ কন্ট্রোলারে ওভাররাইড করতে ভুলবেন না ।


9

হিপ্পোর জবাবের সংযোজন: আপনি যদি কোনও ইউআইএনএভিগেশন কন্ট্রোলার ব্যবহার করেন তবে কোনও বিভাগ যুক্ত করা ভাল:

//  UINavigationController+StatusBarStyle.h:

@interface UINavigationController (StatusBarStyle)

@end



//  UINavigationController+StatusBarStyle.m:

@implementation UINavigationController (StatusBarStyle)

- (UIStatusBarStyle)preferredStatusBarStyle
{
    //also you may add any fancy condition-based code here
    return UIStatusBarStyleLightContent;
}

@end

সেই সমাধানটি শীঘ্রই-হ্রাস করা আচরণে স্যুইচ করার চেয়ে ভাল।


এটি করবেন না, এটি আপাতত কাজ করে তবে ভবিষ্যতের আচরণকে ভেঙে দিতে পারে। শুধু navbar শৈলী পরিবর্তন - আমার উত্তর দেখার stackoverflow.com/a/19513714/505457
টাইসন

2
আপনার সাবক্লাস ব্যবহার করা উচিত, বিভাগ নয়।
shuiyouren

2 টাইসন: এটি ভবিষ্যতের আচরণকে কেন ভেঙে দেবে? পছন্দসই স্ট্যাটাসবারস্টাইল: স্ট্যাটাস বার স্টাইল সেট আপ করার জন্য এটি অ্যাপলের পছন্দের পদ্ধতি।
আর্টেম আব্রামভ

2 শুইউইউরেন: আমি যদি কেবল একটি বিভাগ ব্যবহার করতে পারি এবং যেখানেই চাই সেখানে যেখানে এটি অন্তর্ভুক্ত করতে পারি তবে সাব-ক্লাসিংয়ের মাধ্যমে কেন জটিলতা বাড়াব? যাইহোক, এটি আর্কিটেকচারের প্রশ্ন, বাস্তবায়ন নয়।
আর্টেম আব্রামভ

2
@ আর্টেমআব্রামভ কারণ ইউআইএনএভিগেশন কন্ট্রোলার ইতিমধ্যে ইউআইএনএভিগেশন preferredStatusBarStyleকন্ট্রোলার নির্দিষ্ট যুক্তি প্রয়োগ করে এবং করে। এই মুহূর্তে এই যুক্তিটি ভিত্তিক navigationBar.barStyleতবে আমি দেখতে পাচ্ছি অতিরিক্ত চেকগুলি যুক্ত করা হচ্ছে (উদাঃ UISearchDisplayControllerনেবারবার মোডে আড়াল করা সরিয়ে নেওয়া)। ডিফল্ট যুক্তিকে ওভাররাইড করে আপনি এই সমস্ত কার্যকারিতা আলগা করেন এবং ভবিষ্যতে বিরক্তিকর 'wtf' মুহুর্তের জন্য নিজেকে উন্মুক্ত রেখে যান। এখনও অন্তর্নির্মিত নাভ নিয়ন্ত্রক আচরণকে সমর্থন করার সময় এটি করার সঠিক উপায়ের জন্য উপরে আমার উত্তরটি দেখুন।
টাইসন

9

উপরে 4.2 এবং উপরে

নির্বাচিত উত্তরে উল্লিখিত হিসাবে , মূল কারণটি হ'ল আপনার উইন্ডো রুট ভিউ নিয়ন্ত্রণকারী অবজেক্টটি পরীক্ষা করা।

আপনার প্রবাহ কাঠামোর সম্ভাব্য ক্ষেত্রে

  • কাস্টম ইউআইভিউকন্ট্রোলার অবজেক্ট উইন্ডো রুট ভিউ কন্ট্রোলার

    আপনার উইন্ডো রুট ভিউ কন্ট্রোলারটি একটি ইউআইভিউউকন্ট্রোলার অবজেক্ট এবং এটি আপনার অ্যাপ্লিকেশন প্রবাহের ভিত্তিতে নেভিগেশন নিয়ন্ত্রক বা ট্যাবসন্ট্রোলারটিকে যুক্ত বা সরিয়ে দেয়।

    আপনার অ্যাপ্লিকেশনটিতে ট্যাব ছাড়াই নেভিগেশন স্ট্যাকের প্রাক লগইন প্রবাহ থাকে এবং ট্যাবগুলির সাথে পোস্ট লগইন প্রবাহ থাকে এবং সম্ভবত প্রতিটি ট্যাব আরও ন্যাভিগেশন নিয়ামককে ধারণ করে তবে এই ধরণের প্রবাহ সাধারণত ব্যবহৃত হয়।

  • ট্যাববারকন্ট্রোলার অবজেক্টটি উইন্ডো রুট ভিউ কন্ট্রোলার

    এটি ফ্লো যেখানে উইন্ডো রুট ভিউ কন্ট্রোলারটি ট্যাববারকন্ট্রোলার সম্ভবত প্রতিটি ট্যাব পরবর্তী নেভিগেশন নিয়ামককে ধারণ করে।

  • নেভিগেশনকন্ট্রোলার অবজেক্টটি উইন্ডো রুট ভিউ কন্ট্রোলার

    এটি ফ্লো যেখানে উইন্ডো রুট ভিউ কন্ট্রোলার নেভিগেশনকন্ট্রোলার।

    কোনও বিদ্যমান নেভিগেশন নিয়ামকটিতে ট্যাব বার নিয়ামক বা নতুন নেভিগেশন নিয়ামক যুক্ত করার কোনও সম্ভাবনা আছে কিনা তা আমি নিশ্চিত নই। তবে যদি এরকম কেস থাকে তবে আমাদের স্ট্যাটাস বারের স্টাইল নিয়ন্ত্রণটি পরবর্তী পাত্রে পাস করতে হবে। সুতরাং, আমি অনুসন্ধানের জন্য ইউআইএনএভিগেশন কন্ট্রোলার এক্সটেনশনে একই চেক যুক্ত করেছিchildForStatusBarStyle

নিম্নলিখিত এক্সটেনশনগুলি ব্যবহার করুন, এটি উপরের সমস্ত পরিস্থিতিতে পরিচালনা করে -

extension UITabBarController {
    open override var childForStatusBarStyle: UIViewController? {
        return selectedViewController?.childForStatusBarStyle ?? selectedViewController
    }
}

extension UINavigationController {
    open override var childForStatusBarStyle: UIViewController? {
        return topViewController?.childForStatusBarStyle ?? topViewController
    }
}

extension AppRootViewController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return children.first { $0.childForStatusBarStyle != nil }?.childForStatusBarStyle?.preferredStatusBarStyle ?? .default
    }
}
  • আপনার ডিফল্টরূপে এটির মতো UIViewControllerBasedStatusBarAppearanceকী দরকার নেইinfo.plist

আরও জটিল প্রবাহের জন্য বিবেচনা করার পয়েন্ট

  • আপনি যদি নতুন প্রবাহকে আধুনিকভাবে উপস্থাপন করেন তবে এটি বিদ্যমান স্ট্যাটাস বার শৈলীর প্রবাহ থেকে পৃথক হয়। সুতরাং, ধরুন আপনি একটি উপস্থাপনা করছেন NewFlowUIViewControllerএবং তারপরে নতুন নেভিগেশন বা ট্যাববার কন্ট্রোলার যুক্ত করুন NewFlowUIViewController, তারপরে NewFlowUIViewControllerআরও দেখার নিয়ামকের স্ট্যাটাস বার শৈলীর পরিচালনা করতে পাশাপাশি এক্সটেনশন যুক্ত করুন ।

  • যদি আপনি নির্ধারণ modalPresentationStyle অন্য চেয়ে fullScreenযখন modally উপস্থাপন, আপনি সেট করতে হবে modalPresentationCapturesStatusBarAppearanceসত্য যাতে উপস্থাপন দৃশ্য নিয়ামক স্ট্যাটাস বার চেহারা নিয়ন্ত্রণ অবশ্যই পেতে হবে।


দুর্দান্ত উত্তর!
আমিন বেনারিয়েব

3
এটি ভুল এবং এটি আইওএস 13.4 এ ব্রেক। কারণ সুইফটে অবজেক্টিভ সি ক্লাসগুলি প্রসারণ করা উদ্দেশ্য সি বিভাগগুলির মাধ্যমে প্রয়োগ করা হয়। অবজেক্টিভ সি বিভাগগুলির মাধ্যমে ওভাররাইডিং পদ্ধতিগুলি সুপারিশ করা হয় না এবং সম্ভবত এটির বিরতি ঘটে। স্ট্যাকওভারফ্লো.com
মার্ক এচেভারি

এই বিশেষ উদাহরণটি ভুল ছিল না। বিষয়টির সত্যতা হ'ল ইউআইএনএভিগেশন কন্ট্রোলারের মতো অন্যান্য অবজেক্টস / প্রোটোকলের সাবক্লাসগুলির গতিশীল প্রেরণের বিরোধে এইগুলির পূর্বে কোনও প্রয়োগ ছিল না। প্রকৃত উপশ্রেণীর মধ্যে কোনও ডিফল্ট বা বাস্তবায়ন ছিল না, এজন্য অপ্রয়োজনীয় নির্ভরতা (সময়কাল) তৈরি না করেই কোনও অ্যাপ্লিকেশন জুড়ে এটি প্রয়োগের সবচেয়ে পরিষ্কার উপায়। দুর্ভাগ্যক্রমে, 13.4 এই আচরণটি পরিবর্তন করেছে বলে মনে হচ্ছে। আমি এখন তাদের চেক বা বাস্তবায়ন হয়েছে এমন দৃশ্যের পিছনে অনুমান করছি যা বছরের পর বছর অস্তিত্বহীন ......... .........
TheCodingArt

8

আইওএস 13 সমাধান

UINavigationControllerUIViewController(যারা জানত 🙃) এর একটি সাবক্লাস !

অতএব, নেভিগেশন কন্ট্রোলারে এম্বেড থাকা ভিউ কন্ট্রোলার উপস্থাপন করার সময়, আপনি সত্যিই এমবেড করা ভিউ কন্ট্রোলারগুলি উপস্থাপন করছেন না; আপনি নেভিগেশন কন্ট্রোলার উপস্থাপন করছেন! UINavigationController, একটি সাবক্লাস হিসাবে UIViewController, উত্তরাধিকার সূত্রে প্রাপ্ত preferredStatusBarStyleএবং childForStatusBarStyleযা আপনি পছন্দসই হিসাবে সেট করতে পারেন।

নিম্নলিখিত যে কোন পদ্ধতিতে কাজ করা উচিত:

  1. সম্পূর্ণভাবে ডার্ক মোড থেকে বেরিয়ে যান
    • আপনার মধ্যে info.plist, নিম্নলিখিত সম্পত্তি যুক্ত করুন:
      • কী - UIUserInterfaceStyle(যেমন "ইউজার ইন্টারফেস স্টাইল")
      • মান - হালকা
  2. এর preferredStatusBarStyleমধ্যে ওভাররাইড করুনUINavigationController

    • preferredStatusBarStyle( ডক ) - দর্শন নিয়ামকের জন্য পছন্দসই স্ট্যাটাস বার শৈলী
    • সাবক্লাস বা প্রসারিত UINavigationController

      class MyNavigationController: UINavigationController {
          override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }

      অথবা

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
  3. এর childForStatusBarStyleমধ্যে ওভাররাইড করুনUINavigationController

    • childForStatusBarStyle( ডক ) - বলা হয় যখন সিস্টেমের স্থিতি দণ্ডের শৈলীর নির্ধারণের জন্য ভিউ কন্ট্রোলারের প্রয়োজন হয়
    • অ্যাপলের ডকুমেন্টেশন অনুসারে,

      "যদি আপনার ধারক দৃশ্যের নিয়ামকটি তার চাইল্ড ভিউ কন্ট্রোলারগুলির একটির থেকে তার স্ট্যাটাস বারের স্টাইলটি গ্রহণ করে, [এই সম্পত্তিটিকে ওভাররাইড করুন] এবং সেই শিশু দর্শন নিয়ামককে ফিরিয়ে দিন you "যদি এই পদ্ধতি থেকে ফিরতি মান পরিবর্তন হয়, সেটনিডস্ট্যাটাসবার্পিয়ারেন্সআপডেট () পদ্ধতিতে কল করুন" "

    • অন্য কথায়, আপনি যদি এখানে সমাধান 3 প্রয়োগ করেন না, সিস্টেমটি উপরের 2 দ্রবণে ফিরে যাবে।
    • সাবক্লাস বা প্রসারিত UINavigationController

      class MyNavigationController: UINavigationController {
          override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }

      অথবা

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
    • আপনি উপরে যে কোনও ভিউ কন্ট্রোলার ফিরিয়ে দিতে পারেন। আমি নিম্নলিখিত একটি সুপারিশ:

      • topViewController(এর UINavigationController) ( ডক ) - নেভিগেশন স্ট্যাকের শীর্ষে ভিউ কন্ট্রোলার
      • visibleViewController(এর UINavigationController) ( ডক ) - ন্যাভিগেশন ইন্টারফেসে দৃশ্যমান দৃশ্যের সাথে সম্পর্কিত ভিউ কন্ট্রোলার (ইঙ্গিত: এতে "এমন একটি ভিউ কন্ট্রোলার অন্তর্ভুক্ত থাকতে পারে যা নেভিগেশন নিয়ামকের নিজেই শীর্ষে উপস্থাপিত হয়েছিল")

দ্রষ্টব্য: আপনি যদি সাবক্লাস করার সিদ্ধান্ত নেন UINavigationController মনে রাখবেন যে আইবিতে পরিচয় পরিদর্শকের মাধ্যমে আপনার ন্যাভাল কন্ট্রোলারগুলিতে সেই শ্রেণিটি প্রয়োগ করা উচিত।

পিএস আমার কোডটিতে সুইফট 5.1 সিনট্যাক্স uses ব্যবহার করা হয়েছে 😎


আমার স্ট্যাটাস বারটি পর্দার ঘোরার পরে কালো হচ্ছে। কোন ধারণা কেন? এটি কেবল আইপ্যাড প্রো সিমুলেটারে ঘটে।
পেড্রো পাওলো আমোরিম

@ পেড্রোপোলোআমরিম, আপনি আরও তথ্য সরবরাহ করতে পারেন? শীর্ষ দৃশ্য নিয়ন্ত্রণকারী কীভাবে উপস্থাপিত হবে (মডেল, পূর্ণ পর্দা, শো)? এটি কোনও নেভিগেশন কন্ট্রোলারের ভিতরে বাসা বেঁধেছে? লেখাটি কি কালো হয়ে যাচ্ছে, না পটভূমিটিও? তুমি অর্জন করার জন্য কি চেষ্টা করতেছ?
অ্যান্ড্রু কির্না

আমি আমার সম্পূর্ণ অ্যাপ্লিকেশনটিতে হালকা স্ট্যাটাস বারটি সেট করি। এটি দুটি আবর্তনে হালকা হয়ে যায়, তৃতীয়টির মধ্যে এটি অন্ধকার হয়ে যায় এবং কখনও আলোতে ফিরে আসে না, এমনকি এটি পুনরায় আঁকতে বাধ্য করে। এটি আইপ্যাড প্রো সিমুলেটারে ঘটছে। মতামতগুলি পূর্ণ স্ক্রিনে উপস্থাপিত হচ্ছে এবং এগুলি নেভিগেশন নিয়ামকের অভ্যন্তরে বাসা বাঁধে না। কেবল লেখাটি অন্ধকার হয়ে যায়।
পেড্রো পাওলো আমোরিম

আপনি প্রথম স্থানে হালকা স্ট্যাটাস বারটি কীভাবে সেট করছেন?
অ্যান্ড্রু কিরনা

3
এক্সটেনশনের মাধ্যমে আপনার ওভাররাইড একটি বাস্তব ওভাররাইড নয়। এটি ভাষার একটি অনিরাপদ অপব্যবহার। এটি খুব সহজেই ভেঙে যেতে পারে।
সুলতান

7

ইউএনএভিগেশন কন্ট্রোলারদের ক্ষেত্রে উপরের @ সেরেনের উত্তর এখনও দুর্দান্ত। তবে, সুইফ্ট 3-এর জন্য চাইল্ডভিউ কনট্রোলার ফাংশনগুলিতে পরিবর্তন করা হয়েছে vars। সুতরাং UINavigationControllerএক্সটেনশন কোডটি হওয়া উচিত:

override open var childViewControllerForStatusBarStyle: UIViewController? {
  return topViewController
}

override open var childViewControllerForStatusBarHidden: UIViewController? {
  return topViewController
}

এবং তারপরে ভিউ কন্ট্রোলারে স্ট্যাটাস বার শৈলীর নির্দেশ দেওয়া উচিত:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent
}

2
এটি ভুল এবং এটি আইওএস 13.4 এ ব্রেক। কারণ সুইফটে অবজেক্টিভ সি ক্লাসগুলি প্রসারণ করা উদ্দেশ্য সি বিভাগগুলির মাধ্যমে প্রয়োগ করা হয়। অবজেক্টিভ সি বিভাগগুলির মাধ্যমে ওভাররাইডিং পদ্ধতিগুলি সুপারিশ করা হয় না এবং সম্ভবত এটির বিরতি ঘটে। স্ট্যাকওভারফ্লো.com
মার্ক এচেভারি

এই বিশেষ উদাহরণটি ভুল ছিল না। বিষয়টির সত্যতা হ'ল ইউআইএনএভিগেশন কন্ট্রোলারের মতো অন্যান্য অবজেক্টস / প্রোটোকলের সাবক্লাসগুলির গতিশীল প্রেরণের বিরোধে এইগুলির পূর্বে কোনও প্রয়োগ ছিল না। প্রকৃত উপশ্রেণীর মধ্যে কোনও ডিফল্ট বা বাস্তবায়ন ছিল না, এজন্য অপ্রয়োজনীয় নির্ভরতা (সময়কাল) তৈরি না করেই কোনও অ্যাপ্লিকেশন জুড়ে এটি প্রয়োগের সবচেয়ে পরিষ্কার উপায়। দুর্ভাগ্যক্রমে, 13.4 এই আচরণটি পরিবর্তন করেছে বলে মনে হচ্ছে। আমি এখন তাদের চেক বা বাস্তবায়ন হয়েছে এমন দৃশ্যের পিছনে অনুমান করছি যা বছরের পর বছর অস্তিত্বহীন ......... .........
TheCodingArt

6

যদি আপনার ভিউকন্ট্রোলারটি ইউআইএনএভিগেশন কন্ট্রোলারের অধীনে থাকে।

সাবক্লাস ইউআইএনএভিগেশন কন্ট্রোলার এবং অ্যাড

override var preferredStatusBarStyle: UIStatusBarStyle {
    return topViewController?.preferredStatusBarStyle ?? .default
}

ভিউকন্ট্রোলারকে preferredStatusBarStyleডাকা হবে।



4

আইওএস 7 এ ইউআইএসটিটাসবারস্টাইল

আইওএস in-এর স্ট্যাটাস বারটি স্বচ্ছ, এর পেছনের দৃশ্যটি দেখায়।

স্ট্যাটাস বারের স্টাইলটি এর সামগ্রীর উপস্থিতি বোঝায়। আইওএস 7-এ, স্ট্যাটাস বারের সামগ্রীটি গা dark় ( UIStatusBarStyleDefault) বা হালকা ( UIStatusBarStyleLightContent)। উভয়ই UIStatusBarStyleBlackTranslucentএবং UIStatusBarStyleBlackOpaqueআইওএস 7.0 এ অবমূল্যায়িত হয়েছে। UIStatusBarStyleLightContentপরিবর্তে ব্যবহার করুন।

কিভাবে পরিবর্তন করব UIStatusBarStyle

যদি স্থিতি বারের নীচে একটি নেভিগেশন বার হয়, নেভিগেশন বার শৈলীর সাথে মিলিয়ে স্থিতি দণ্ড শৈলীর সমন্বয় করা হবে ( UINavigationBar.barStyle):

বিশেষত, নেভিগেশন বারের স্টাইলটি যদি UIBarStyleDefault হয়, তবে স্ট্যাটাস বারের স্টাইলটি হবে UIStatusBarStyleDefault; যদি নেভিগেশন বার শৈলী হয় UIBarStyleBlack, স্থিতি দণ্ড শৈলী হবে UIStatusBarStyleLightContent

যদি স্থিতি বারের নীচে কোনও নেভিগেশন বার না থাকে, অ্যাপটি চলাকালীন স্থিতি দণ্ড শৈলীটি পৃথক দর্শন নিয়ামক দ্বারা নিয়ন্ত্রিত ও পরিবর্তিত হতে পারে।

- [UIViewController preferredStatusBarStyle]এটি আইওএস-এ যুক্ত একটি নতুন পদ্ধতি 7.. এটি পছন্দসই স্ট্যাটাস বার শৈলীতে ফিরে আসার জন্য ওভাররাইড করা যেতে পারে:

- (UIStatusBarStyle)preferredStatusBarStyle
  {
      return UIStatusBarStyleLightContent;
  }

যদি স্থিতি বারের স্টাইলটি স্ব-পরিবর্তে চাইল্ড ভিউ কন্ট্রোলার দ্বারা নিয়ন্ত্রিত করা উচিত তবে -[UIViewController childViewControllerForStatusBarStyle]সেই শিশু দর্শন নিয়ামককে ফিরিয়ে আনতে ওভাররাইড করুন ।

আপনি যদি এই আচরণটি থেকে বেরিয়ে আসা এবং -[UIApplication statusBarStyle]পদ্ধতিটি ব্যবহার করে স্থিতি দণ্ড শৈলী সেট করতে পছন্দ করেন তবে UIViewControllerBasedStatusBarAppearanceকোনও অ্যাপ্লিকেশনটির Info.plistফাইলে কীটি যুক্ত করুন এবং মানটি কোনও দিন না।


3

যদি কেউ নেভিগেশন কন্ট্রোলার ব্যবহার করে এবং তাদের সমস্ত নেভিগেশন কন্ট্রোলারকে কালো স্টাইল করতে চায় তবে আপনি সুইট 3-তে এই জাতীয় ইউএনএভিগেশন কন্ট্রোলারকে একটি এক্সটেনশন লিখতে পারেন এবং এটি সমস্ত নেভিগেশন কন্ট্রোলারের ক্ষেত্রে প্রযোজ্য হবে (এটিকে একটি নিয়ামককে এটির পরিবর্তে নিয়োগের পরিবর্তে) সময়)।

extension UINavigationController {

    override open func viewDidLoad() {
        super.viewDidLoad()

        self.navigationBar.barStyle = UIBarStyle.black
    }

}

1
তবে কি যদি আমার নেভিগেশন বার লুকিয়ে থাকে?
স্লাভচো

1
কারণ আমার নেভিগেশনটি লুকিয়ে রাখতে এবং স্ট্যাটাস বারটি দৃশ্যমান হওয়া দরকার।
স্লাভচো

1

যেকোন ধরণের ইউআইভিউউকন্ট্রোলারের জন্য সুইফটে:

আপনার AppDelegateসেটে:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    window!.rootViewController = myRootController
    return true
}

myRootControllerযে কোনও ধরণের হতে পারে UIViewController, যেমন UITabBarControllerবা UINavigationController

তারপরে, এই রুট নিয়ামকটিকে এইভাবে ওভাররাইড করুন:

class RootController: UIViewController {
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
}

এটি আপনার পুরো অ্যাপ্লিকেশনটিতে স্ট্যাটাস বারের উপস্থিতি পরিবর্তন করবে, কারণ স্ট্যাটাস বারের উপস্থিতির জন্য রুট কন্ট্রোলার একমাত্র দায়বদ্ধ responsible

View controller-based status bar appearanceআপনার Info.plistএই কাজটি করার জন্য সম্পত্তিটি হ্যাঁ সেট করতে মনে রাখবেন (যা পূর্বনির্ধারিত)।


@ কীভাবে এটি সুইফট 3-এ আসে?
বিমান

1

সুইফট 3 আইওএস 10 সমাধান:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
 }

1

উত্তরগুলির বেশিরভাগ ক্ষেত্রে childViewControllerForStatusBarStyleপদ্ধতির ভাল প্রয়োগের অন্তর্ভুক্ত নয় UINavigationController। আমার অভিজ্ঞতা অনুসারে আপনার যেমন কেসগুলি হ্যান্ডেল করা উচিত যখন ন্যাভিগেশন নিয়ন্ত্রকের উপর স্বচ্ছ ভিউ কন্ট্রোলার উপস্থাপন করা হয়। এই ক্ষেত্রে আপনার নিজের মডেল কন্ট্রোলারের ( visibleViewController) নিয়ন্ত্রণ নিয়ন্ত্রণ করা উচিত , তবে এটি অদৃশ্য হয়ে যাওয়ার পরে নয়।

override var childViewControllerForStatusBarStyle: UIViewController? {
  var childViewController = visibleViewController
  if let controller = childViewController, controller.isBeingDismissed {
    childViewController = topViewController
  }
  return childViewController?.childViewControllerForStatusBarStyle ?? childViewController
}

1

আমার ক্ষেত্রে, আমি দুর্ঘটনাক্রমে ভিউ / নেভিগেশন কন্ট্রোলার হিসাবে উপস্থাপন করেছি UIModalPresentationStyle.overFullScreen, যার কারণ preferredStatusBarStyleহিসাবে ডাকা হচ্ছে না। এটিকে আবার স্যুইচ করার পরে UIModalPresentationStyle.fullScreen, সমস্ত কিছু কাজ করে।


1

আইওএস ১৩.৪ হিসাবে বিভাগের preferredStatusBarStyleপদ্ধতিটি কল করা UINavigationControllerহবে না, একটি সাবক্লাস ব্যবহার না করেই সুইজলিং একমাত্র বিকল্প বলে মনে হচ্ছে।

উদাহরণ:

বিভাগ শিরোনাম:

@interface UINavigationController (StatusBarStyle)
+ (void)setUseLightStatusBarStyle;
@end

বাস্তবায়ন:

#import "UINavigationController+StatusBarStyle.h"
#import <objc/runtime.h>

@implementation UINavigationController (StatusBarStyle)

void (^swizzle)(Class, SEL, SEL) = ^(Class c, SEL orig, SEL new){
    Method origMethod = class_getInstanceMethod(c, orig);
    Method newMethod = class_getInstanceMethod(c, new);
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
        class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    else
        method_exchangeImplementations(origMethod, newMethod);
};

+ (void)setUseLightStatusBarStyle {
    swizzle(self.class, @selector(preferredStatusBarStyle), @selector(_light_preferredStatusBarStyle));
}

- (UIStatusBarStyle)_light_preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}    
@end

AppDelegate.h এ ব্যবহার:

#import "UINavigationController+StatusBarStyle.h"

[UINavigationController setUseLightStatusBarStyle];

0

এটি সমাধানের জন্য আমার পদ্ধতিটি এখানে।

এজিভিউকন্ট্রোলার অ্যাপিয়ারেন্স নামে একটি প্রোটোকল সংজ্ঞায়িত করুন ।

AGViewControllerAppearance.h

#import <Foundation/Foundation.h>

@protocol AGViewControllerAppearance <NSObject>

@optional

- (BOOL)showsStatusBar;
- (BOOL)animatesStatusBarVisibility;
- (UIStatusBarStyle)preferredStatusBarStyle;
- (UIStatusBarAnimation)prefferedStatusBarAnimation;

@end

ইউআইভিউউকন্ট্রোলারে আপগ্রেড নামে একটি বিভাগ নির্ধারণ করুন ।

UIViewController + + Upgrade.h

#import <UIKit/UIKit.h>

@interface UIViewController (Upgrade)

//
//  Replacements
//

- (void)upgradedViewWillAppear:(BOOL)animated;

@end

UIViewController + + Upgrade.m

#import "UIViewController+Upgrade.h"

#import <objc/runtime.h>

#import "AGViewControllerAppearance.h" // This is the appearance protocol

@implementation UIViewController (Upgrade)

+ (void)load
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wselector"
    Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));
#pragma clang diagnostic pop
    Method upgradedViewWillAppear = class_getInstanceMethod(self, @selector(upgradedViewWillAppear:));
    method_exchangeImplementations(viewWillAppear, upgradedViewWillAppear);
}

#pragma mark - Implementation

- (void)upgradedViewWillAppear:(BOOL)animated
{
    //
    //  Call the original message (it may be a little confusing that we're
    //  calling the 'same' method, but we're actually calling the original one :) )
    //

    [self upgradedViewWillAppear:animated];

    //
    //  Implementation
    //

    if ([self conformsToProtocol:@protocol(AGViewControllerAppearance)])
    {
        UIViewController <AGViewControllerAppearance> *viewControllerConformingToAppearance =
        (UIViewController <AGViewControllerAppearance> *)self;

        //
        //  Status bar
        //

        if ([viewControllerConformingToAppearance respondsToSelector:@selector(preferredStatusBarStyle)])
        {
            BOOL shouldAnimate = YES;

            if ([viewControllerConformingToAppearance respondsToSelector:@selector(animatesStatusBarVisibility)])
            {
                shouldAnimate = [viewControllerConformingToAppearance animatesStatusBarVisibility];
            }

            [[UIApplication sharedApplication] setStatusBarStyle:[viewControllerConformingToAppearance preferredStatusBarStyle]
                                                        animated:shouldAnimate];
        }

        if ([viewControllerConformingToAppearance respondsToSelector:@selector(showsStatusBar)])
        {
            UIStatusBarAnimation animation = UIStatusBarAnimationSlide;

            if ([viewControllerConformingToAppearance respondsToSelector:@selector(prefferedStatusBarAnimation)])
            {
                animation = [viewControllerConformingToAppearance prefferedStatusBarAnimation];
            }

            [[UIApplication sharedApplication] setStatusBarHidden:(! [viewControllerConformingToAppearance showsStatusBar])
                                                    withAnimation:animation];
        }
    }
}

@end

এখন, এখন দেখার সময় হয়েছে যে আপনি দেখার নিয়ামকটি এজিভিউকন্ট্রোলার অ্যাপ্লিকেশনটি প্রয়োগ করছে প্রোটোকলটি ।

উদাহরণ:

@interface XYSampleViewController () <AGViewControllerAppearance>

... the rest of the interface

@end

অবশ্যই, আপনি পদ্ধতি (বাকি বাস্তবায়ন করতে পারে showsStatusBar , animatesStatusBarVisibility , prefferedStatusBarAnimation প্রোটোকল এবং থেকে) UIViewController + + আপগ্রেড সঠিক তাদের দ্বারা উল্লিখিত মানগুলি উপর ভিত্তি করে স্বনির্ধারণ করতে হবে।


0

কেউ যদি ইউআইএস সার্চ কন্ট্রোলার দিয়ে এই সমস্যাটি চালায়। কেবলমাত্র ইউআইএস সার্চ কন্ট্রোলারের একটি নতুন সাবক্লাস তৈরি করুন এবং তারপরে সেই শ্রেণিতে নীচে কোড যুক্ত করুন:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}

0

মনে রাখবেন যে যখন ব্যবহার self.navigationController.navigationBar.barStyle = UIBarStyleBlack;সমাধান

নিশ্চিত হয়ে যান আপনার প্লাস্টে যান এবং "দেখুন কন্ট্রোলার-ভিত্তিক স্ট্যাটাস বারের উপস্থিতি" হ্যাঁ সেট করুন। এটি না হলে এটি কাজ করবে না।


প্রকল্প প্লিস্টে ইউআইভিউকন্ট্রোলারবেসড স্ট্যাটাসবার অ্যাপ্লিকেশনটি হ্যাঁ সেট করা আমার জন্য সমস্ত পার্থক্য তৈরি করে। আমি এটা সম্পর্কে বিস্মৃত ছিল।
ফিলিও

0

এক্সকোড 11.4 থেকে, ওভাররাইড করে preferredStatusBarStyleএক্সকোড ইউআইএনএভিগেশন কন্ট্রোলার এক্সটেনশনে সম্পত্তি এখন আর কাজ করে না কারণ এটি কল করা হবে না।

সেট barStyleএর navigationBarজন্য .blackকাজ প্রকৃতপক্ষে কিন্তু এই অবাঞ্ছিত পার্শ্ব প্রতিক্রিয়া যোগ করা হবে যদি আপনি navigationBar যা আলো এবং অন্ধকার মোডের জন্য বিভিন্ন চেহারাগুলো থাকতে পারে subviews যোগ করুন। কারণ কালোকে সেট করে barStyle, userInterfaceStyleনেভিগেশনবারে এমবেড করা একটি ভিউ এর পরে অ্যাপ্লিকেশনটি userInterfaceStyle.darkনির্বিশেষে সর্বদা থাকবে userInterfaceStyle

আমি যে সঠিক সমাধানটি নিয়ে আসছি তা হ'ল একটি সাবক্লাস যুক্ত করে সেখানে UINavigationControllerওভাররাইড preferredStatusBarStyleকরা। তারপরে আপনি যদি আপনার সমস্ত দর্শনগুলির জন্য এই কাস্টম ইউআইএনএভিগেশন কন্ট্রোলার ব্যবহার করেন তবে আপনি সংরক্ষণের পক্ষে থাকবেন।


-1

নেভিগেশনকন্ট্রোলার বা ট্যাববারকন্ট্রোলার হ'ল স্টাইল সরবরাহ করা দরকার। আমি কীভাবে সমাধান করেছি তা এখানে: https://stackoverflow.com/a/39072526/242769


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