আমি এই থ্রেডটিকে ওভাররাইড করার জন্য অনুসরণ করেছি -preferredStatusBarStyle
, তবে এটি বলা হয় না। এটি সক্ষম করতে আমি যে কোনও বিকল্পগুলি পরিবর্তন করতে পারি? (আমি আমার প্রকল্পে XIBs ব্যবহার করছি।)
আমি এই থ্রেডটিকে ওভাররাইড করার জন্য অনুসরণ করেছি -preferredStatusBarStyle
, তবে এটি বলা হয় না। এটি সক্ষম করতে আমি যে কোনও বিকল্পগুলি পরিবর্তন করতে পারি? (আমি আমার প্রকল্পে XIBs ব্যবহার করছি।)
উত্তর:
আমারও একই সমস্যা ছিল এবং আমি বুঝতে পেরেছিলাম যে এটি ঘটছে কারণ আমি আমার অ্যাপ্লিকেশন উইন্ডোতে রুট ভিউ কন্ট্রোলার সেট করছি না।
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;
}
বিকল্পভাবে, আপনি প্রতিটি ভিউ কন্ট্রোলারে যথাযথ হিসাবে যথাযথভাবে ব্যবহার করতে না গিয়ে তার পটভূমির রঙের উপর নির্ভর করে নীচের একটি পদ্ধতিতে কল করতে পারেন setNeedsStatusBarAppearanceUpdate
:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
অথবা
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
মনে রাখবেন যে আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে প্লাস্ট ফাইলটিতেও আপনাকে সেট UIViewControllerBasedStatusBarAppearance
করতে NO
হবে।
setNeedsStatusBarAppearanceUpdate
- আমি এই পরিবর্তনটি করার সময় আমার সন্দেহগুলি নিশ্চিত হয়েছিল।
ইউআইএনএভিগেশন নিয়ন্ত্রণকারী যে কারও জন্য:
UINavigationController
এগিয়ে না preferredStatusBarStyle
তার সন্তানের দৃশ্য কন্ট্রোলার কল। পরিবর্তে এটি তার নিজস্ব রাজ্য পরিচালনা করে - যেমনটি হওয়া উচিত, এটি পর্দার শীর্ষে অঙ্কিত হচ্ছে যেখানে স্ট্যাটাস বারটি বাস করে এবং তাই এর জন্যও দায়বদ্ধ হওয়া উচিত। এর preferredStatusBarStyle
জন্য কোনও ন্যাভাল কন্ট্রোলারের মধ্যে আপনার ভিসিগুলিতে প্রয়োগ করার ফলে কিছুই করবে না - তাদের কখনই ডাকা হবে না।
কৌতুক কি UINavigationController
কি জন্য ফিরে যাওয়ার সিদ্ধান্ত নিতে ব্যবহার UIStatusBarStyleDefault
বা UIStatusBarStyleLightContent
। এটা তার উপর এই সেগুলো UINavigationBar.barStyle
। ডিফল্ট ( UIBarStyleDefault
) এর ফলে অন্ধকারের অগ্রভাগের UIStatusBarStyleDefault
স্থিতি দণ্ড in এবং UIBarStyleBlack
একটি UIStatusBarStyleLightContent
স্ট্যাটাস বার দেবে।
টি এল; ডিআর:
যদি আপনি চান UIStatusBarStyleLightContent
একটি উপর UINavigationController
ব্যবহার:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
preferredStatusBarStyle
আপনি নেভিগেশন বারটি ঠিকঠাকভাবে (সেট navigationBarHidden
করা YES
) লুকিয়ে রাখলে প্রকৃতপক্ষে চাইল্ড ভিউ কন্ট্রোলারকে ডাকা হবে ।
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
navigationBarHidden
সেটটি YES
আসলে preferredStatusBarStyle
ডেকেছে এবং এটিতে হোঁচট খেতে পারে তাদের জন্য একটি সতর্কতা: এটি কাজ করে navigationBarHidden
তবে সাথে নয় navigationBar.hidden
!
সুতরাং আমি আসলে ইউআইএনএভিগেশন কন্ট্রোলারটিতে একটি বিভাগ যুক্ত করেছি তবে পদ্ধতিগুলি ব্যবহার করেছি:
-(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;
- না
super
এই পদ্ধতিতে কল করার দরকার নেই এবং আপনি আসলে এই ধরণের সমস্ত কন্ট্রোলারের আচরণ পরিবর্তন করতে চান
যে কেউ এখনও এর সাথে লড়াই করছেন, দ্রুতগতির এই সাধারণ বর্ধনের জন্য আপনার সমস্যার সমাধান করা উচিত।
extension UINavigationController {
override open var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
}
আমার অ্যাপ্লিকেশানের সব তিনটি ব্যবহৃত: 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
}
}
স্ট্যাটাস বারের রঙ সাদা করে পরিবর্তনের জন্য টাইসনের উত্তর সঠিক 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;
}
একটি ইউআইএনএভিগেশন কন্ট্রোলার এ 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
}
}
সেরেনের উত্তর ছাড়াও, যদি আপনি একটি modalPresentationStyle
(উদাহরণস্বরূপ .overCurrentContext
) দিয়ে একটি ভিউ কন্ট্রোলার উপস্থাপন করেন তবে আপনাকে নতুন উপস্থাপিত ভিউ কন্ট্রোলারের সাথেও এটি কল করা উচিত:
presentedViewController.modalPresentationCapturesStatusBarAppearance = true
preferredStatusBarStyle
উপস্থাপিত ভিউ কন্ট্রোলারে ওভাররাইড করতে ভুলবেন না ।
হিপ্পোর জবাবের সংযোজন: আপনি যদি কোনও ইউআইএনএভিগেশন কন্ট্রোলার ব্যবহার করেন তবে কোনও বিভাগ যুক্ত করা ভাল:
// 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
সেই সমাধানটি শীঘ্রই-হ্রাস করা আচরণে স্যুইচ করার চেয়ে ভাল।
preferredStatusBarStyle
কন্ট্রোলার নির্দিষ্ট যুক্তি প্রয়োগ করে এবং করে। এই মুহূর্তে এই যুক্তিটি ভিত্তিক navigationBar.barStyle
তবে আমি দেখতে পাচ্ছি অতিরিক্ত চেকগুলি যুক্ত করা হচ্ছে (উদাঃ UISearchDisplayController
নেবারবার মোডে আড়াল করা সরিয়ে নেওয়া)। ডিফল্ট যুক্তিকে ওভাররাইড করে আপনি এই সমস্ত কার্যকারিতা আলগা করেন এবং ভবিষ্যতে বিরক্তিকর 'wtf' মুহুর্তের জন্য নিজেকে উন্মুক্ত রেখে যান। এখনও অন্তর্নির্মিত নাভ নিয়ন্ত্রক আচরণকে সমর্থন করার সময় এটি করার সঠিক উপায়ের জন্য উপরে আমার উত্তরটি দেখুন।
নির্বাচিত উত্তরে উল্লিখিত হিসাবে , মূল কারণটি হ'ল আপনার উইন্ডো রুট ভিউ নিয়ন্ত্রণকারী অবজেক্টটি পরীক্ষা করা।
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
সত্য যাতে উপস্থাপন দৃশ্য নিয়ামক স্ট্যাটাস বার চেহারা নিয়ন্ত্রণ অবশ্যই পেতে হবে।
UINavigationController
UIViewController
(যারা জানত 🙃) এর একটি সাবক্লাস !
অতএব, নেভিগেশন কন্ট্রোলারে এম্বেড থাকা ভিউ কন্ট্রোলার উপস্থাপন করার সময়, আপনি সত্যিই এমবেড করা ভিউ কন্ট্রোলারগুলি উপস্থাপন করছেন না; আপনি নেভিগেশন কন্ট্রোলার উপস্থাপন করছেন! UINavigationController
, একটি সাবক্লাস হিসাবে UIViewController
, উত্তরাধিকার সূত্রে প্রাপ্ত preferredStatusBarStyle
এবং childForStatusBarStyle
যা আপনি পছন্দসই হিসাবে সেট করতে পারেন।
নিম্নলিখিত যে কোন পদ্ধতিতে কাজ করা উচিত:
info.plist
, নিম্নলিখিত সম্পত্তি যুক্ত করুন:
UIUserInterfaceStyle
(যেমন "ইউজার ইন্টারফেস স্টাইল")এর preferredStatusBarStyle
মধ্যে ওভাররাইড করুনUINavigationController
preferredStatusBarStyle
( ডক ) - দর্শন নিয়ামকের জন্য পছন্দসই স্ট্যাটাস বার শৈলীসাবক্লাস বা প্রসারিত UINavigationController
class MyNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
অথবা
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
এর childForStatusBarStyle
মধ্যে ওভাররাইড করুনUINavigationController
childForStatusBarStyle
( ডক ) - বলা হয় যখন সিস্টেমের স্থিতি দণ্ডের শৈলীর নির্ধারণের জন্য ভিউ কন্ট্রোলারের প্রয়োজন হয়"যদি আপনার ধারক দৃশ্যের নিয়ামকটি তার চাইল্ড ভিউ কন্ট্রোলারগুলির একটির থেকে তার স্ট্যাটাস বারের স্টাইলটি গ্রহণ করে, [এই সম্পত্তিটিকে ওভাররাইড করুন] এবং সেই শিশু দর্শন নিয়ামককে ফিরিয়ে দিন you "যদি এই পদ্ধতি থেকে ফিরতি মান পরিবর্তন হয়, সেটনিডস্ট্যাটাসবার্পিয়ারেন্সআপডেট () পদ্ধতিতে কল করুন" "
সাবক্লাস বা প্রসারিত 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-এর জন্য চাইল্ডভিউ কনট্রোলার ফাংশনগুলিতে পরিবর্তন করা হয়েছে vars
। সুতরাং UINavigationController
এক্সটেনশন কোডটি হওয়া উচিত:
override open var childViewControllerForStatusBarStyle: UIViewController? {
return topViewController
}
override open var childViewControllerForStatusBarHidden: UIViewController? {
return topViewController
}
এবং তারপরে ভিউ কন্ট্রোলারে স্ট্যাটাস বার শৈলীর নির্দেশ দেওয়া উচিত:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
যদি আপনার ভিউকন্ট্রোলারটি ইউআইএনএভিগেশন কন্ট্রোলারের অধীনে থাকে।
সাবক্লাস ইউআইএনএভিগেশন কন্ট্রোলার এবং অ্যাড
override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
ভিউকন্ট্রোলারকে preferredStatusBarStyle
ডাকা হবে।
আইওএস 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-তে এই জাতীয় ইউএনএভিগেশন কন্ট্রোলারকে একটি এক্সটেনশন লিখতে পারেন এবং এটি সমস্ত নেভিগেশন কন্ট্রোলারের ক্ষেত্রে প্রযোজ্য হবে (এটিকে একটি নিয়ামককে এটির পরিবর্তে নিয়োগের পরিবর্তে) সময়)।
extension UINavigationController {
override open func viewDidLoad() {
super.viewDidLoad()
self.navigationBar.barStyle = UIBarStyle.black
}
}
যেকোন ধরণের ইউআইভিউউকন্ট্রোলারের জন্য সুইফটে:
আপনার 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
এই কাজটি করার জন্য সম্পত্তিটি হ্যাঁ সেট করতে মনে রাখবেন (যা পূর্বনির্ধারিত)।
উত্তরগুলির বেশিরভাগ ক্ষেত্রে childViewControllerForStatusBarStyle
পদ্ধতির ভাল প্রয়োগের অন্তর্ভুক্ত নয় UINavigationController
। আমার অভিজ্ঞতা অনুসারে আপনার যেমন কেসগুলি হ্যান্ডেল করা উচিত যখন ন্যাভিগেশন নিয়ন্ত্রকের উপর স্বচ্ছ ভিউ কন্ট্রোলার উপস্থাপন করা হয়। এই ক্ষেত্রে আপনার নিজের মডেল কন্ট্রোলারের ( visibleViewController
) নিয়ন্ত্রণ নিয়ন্ত্রণ করা উচিত , তবে এটি অদৃশ্য হয়ে যাওয়ার পরে নয়।
override var childViewControllerForStatusBarStyle: UIViewController? {
var childViewController = visibleViewController
if let controller = childViewController, controller.isBeingDismissed {
childViewController = topViewController
}
return childViewController?.childViewControllerForStatusBarStyle ?? childViewController
}
আইওএস ১৩.৪ হিসাবে বিভাগের 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];
এটি সমাধানের জন্য আমার পদ্ধতিটি এখানে।
এজিভিউকন্ট্রোলার অ্যাপিয়ারেন্স নামে একটি প্রোটোকল সংজ্ঞায়িত করুন ।
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 + + আপগ্রেড সঠিক তাদের দ্বারা উল্লিখিত মানগুলি উপর ভিত্তি করে স্বনির্ধারণ করতে হবে।
মনে রাখবেন যে যখন ব্যবহার self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
সমাধান
নিশ্চিত হয়ে যান আপনার প্লাস্টে যান এবং "দেখুন কন্ট্রোলার-ভিত্তিক স্ট্যাটাস বারের উপস্থিতি" হ্যাঁ সেট করুন। এটি না হলে এটি কাজ করবে না।
এক্সকোড 11.4 থেকে, ওভাররাইড করে preferredStatusBarStyle
এক্সকোড ইউআইএনএভিগেশন কন্ট্রোলার এক্সটেনশনে সম্পত্তি এখন আর কাজ করে না কারণ এটি কল করা হবে না।
সেট barStyle
এর navigationBar
জন্য .black
কাজ প্রকৃতপক্ষে কিন্তু এই অবাঞ্ছিত পার্শ্ব প্রতিক্রিয়া যোগ করা হবে যদি আপনি navigationBar যা আলো এবং অন্ধকার মোডের জন্য বিভিন্ন চেহারাগুলো থাকতে পারে subviews যোগ করুন। কারণ কালোকে সেট করে barStyle
, userInterfaceStyle
নেভিগেশনবারে এমবেড করা একটি ভিউ এর পরে অ্যাপ্লিকেশনটি userInterfaceStyle.dark
নির্বিশেষে সর্বদা থাকবে userInterfaceStyle
।
আমি যে সঠিক সমাধানটি নিয়ে আসছি তা হ'ল একটি সাবক্লাস যুক্ত করে সেখানে UINavigationController
ওভাররাইড preferredStatusBarStyle
করা। তারপরে আপনি যদি আপনার সমস্ত দর্শনগুলির জন্য এই কাস্টম ইউআইএনএভিগেশন কন্ট্রোলার ব্যবহার করেন তবে আপনি সংরক্ষণের পক্ষে থাকবেন।
নেভিগেশনকন্ট্রোলার বা ট্যাববারকন্ট্রোলার হ'ল স্টাইল সরবরাহ করা দরকার। আমি কীভাবে সমাধান করেছি তা এখানে: https://stackoverflow.com/a/39072526/242769