আইওএস 13 এ অন্ধকার মোডের বিকল্পটি বেছে নেওয়া কি সম্ভব?


295

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

ডার্ক মোড সমর্থনটিকে অপ্ট আউট করা কি এমনভাবে সম্ভব যে আমাদের অ্যাপটি সর্বদা ওয়েবসাইট থিমের সাথে মেলে হালকা মোড দেখায়?


70
সেট UIUserInterfaceStyleথেকে Lightআপনার Info.Plist হবে। বিকাশকারী.অ্যাপল.
com

1
জিজ্ঞাসা করার জন্য ধন্যবাদ - আমাদের সবার জন্য। প্রচুর অ্যাপ্লিকেশন যেতে হবে। টগল প্রস্তুত না হওয়া পর্যন্ত এটি অ্যাপ্লিকেশনগুলিকে কাজ করে রাখা প্রয়োজন।
ব্যবহারকারী3741598

আমদানি ফাউন্ডেশন আমদানি ইউআইকিট এক্সটেনশন ইউআইভিউউকন্ট্রোলার open ওভাররাইড ওপেন ফানক জাগ্রত করুনফ্রমনিব () {সুপার.ওয়াকফ্র্যামনিব () যদি # উপলভ্য থাকে (আইওএস 13.0, *) {// সর্বদা হালকা ইন্টারফেস শৈলী অবলম্বন করুন। overrideUserInterfaceStyle =।
আলোক

1
প্লিস্টে কেবল UIUserInterfaceStyle যুক্ত করুন । এটি এত সহজ
ফ্যাটি

অ্যাপস্টোরে অ্যাপ্লিকেশন জমা দেওয়ার সময় লাইট মোডে UIUserInterfaceStyle এর কারণে অ্যাপল গ্রহণ করে।
কিরণ

উত্তর:


680

প্রথমত, এখানে অন্ধকার মোড বেছে নেওয়ার সাথে সম্পর্কিত অ্যাপলের এন্ট্রিএই লিঙ্কের সামগ্রীটি Xcode 11 এবং iOS 13 এর জন্য লেখা হয়েছে :

এই বিভাগটি এক্সকোড 11 ব্যবহারের জন্য প্রযোজ্য


আপনি যদি আপনার পুরো অ্যাপ্লিকেশনটি বেছে নিতে চান তবে

পন্থা # 1

আপনার তথ্য.পলিট ফাইলটিতে নিম্নলিখিত কীটি ব্যবহার করুন:

UIUserInterfaceStyle

এবং এটির একটি মূল্য নির্ধারণ করুন Light

এক্সএমএল জন্য UIUserInterfaceStyleনিয়োগ:

<key>UIUserInterfaceStyle</key>
<string>Light</string>

পদ্ধতির # 2

আপনি overrideUserInterfaceStyleঅ্যাপের windowভেরিয়েবলের বিপরীতে সেট করতে পারেন ।

আপনার প্রকল্পটি কীভাবে তৈরি হয়েছিল তার উপর নির্ভর করে এটি AppDelegateফাইল বা এর মধ্যে থাকতে পারে SceneDelegate

if #available(iOS 13.0, *) {
    window?.overrideUserInterfaceStyle = .light
}


যদি আপনি স্বতন্ত্র ভিত্তিতে আপনার ইউআইভিউকন্ট্রোলারটিকে অনির্বাচন করতে চান

override func viewDidLoad() {
    super.viewDidLoad()
    // overrideUserInterfaceStyle is available with iOS 13
    if #available(iOS 13.0, *) {
        // Always adopt a light interface style.
        overrideUserInterfaceStyle = .light
    }
}

ওভাররাইডউজারআইন্টারফেস স্টাইলের জন্য অ্যাপল ডকুমেন্টেশন

উপরের কোডটি Xcode 11 এ কেমন লাগবে:

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

এই বিভাগটি Xcode 10.x ব্যবহারের জন্য প্রযোজ্য


আপনি যদি আপনার জমা দেওয়ার জন্য এক্সকোড 11 ব্যবহার করেন তবে আপনি এই লাইনের নীচে সমস্ত কিছু নিরাপদে উপেক্ষা করতে পারবেন।

যেহেতু প্রাসঙ্গিক এআইপিএস আইওএস 12 তে বিদ্যমান নেই, সুতরাং উপরোক্ত মানগুলি ব্যবহার করার চেষ্টা করার সময় আপনি ত্রুটিগুলি পেয়ে যাবেন:

overrideUserInterfaceStyleআপনার মধ্যে সেট করার জন্যUIViewController

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

যদি আপনি স্বতন্ত্র ভিত্তিতে আপনার ইউআইভিউকন্ট্রোলারটিকে অনির্বাচন করতে চান

সংকলক সংস্করণ এবং আইওএস সংস্করণ পরীক্ষা করে এটি এক্সকোড 10 এ পরিচালনা করা যায়:

#if compiler(>=5.1)
if #available(iOS 13.0, *) {
    // Always adopt a light interface style.
    overrideUserInterfaceStyle = .light
}
#endif

আপনি যদি আপনার পুরো অ্যাপ্লিকেশনটি বেছে নিতে চান তবে

আপনার AppDelegateফাইলটিতে নিম্নলিখিত কোড যুক্ত করে এক্সকোড 10 এর জন্য পুরো অ্যাপ্লিকেশনটির বিরুদ্ধে কাজ করতে আপনি উপরের স্নিপেটটি সংশোধন করতে পারেন ।

#if compiler(>=5.1)
if #available(iOS 13.0, *) {
    // Always adopt a light interface style.
    window?.overrideUserInterfaceStyle = .light
}
#endif

তবে এক্সকোড সংস্করণ 10.x ব্যবহার করার সময় প্লিস্ট সেটিংস ব্যর্থ হবে:

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

ক্রেডিট @Aron নেলসন , @Raimundas Sakalauskas , @NSLeader এবং rmaddy তাদের প্রতিক্রিয়ার সাথে এই উত্তরটি আরও উন্নত করার জন্য।


2
আপনার অ্যাপটি এখনই আপডেট / আপলোড করার সময় UIUserInterfaceStyle আলো ব্লক করা আছে। এটি একটি অবৈধ plist এন্ট্রি হিসাবে পতাকাঙ্কিত হয়। (অবৈধ প্লিস্ট কী)
অ্যারন নেলসন

2
এটি আইওএস এসডিকে 12 (বর্তমানে সর্বশেষতম স্থিতিশীল এসডিকে) এর বিরুদ্ধে সংকলন করবে না। সমাধানের জন্য স্ট্যাকওভারফ্লো.com/a/57521901/2249485 দেখুন যা আইওএস 12 এসডিকে নিয়েও কাজ করবে।
রায়মুন্দাস সাকালাউস্কাস

এটি এতটা অন্যায় যে প্রশ্নটি "মূল প্রশ্ন" এর চেয়ে অনেক বেশি মতামত রয়েছে উত্তর সরবরাহের জন্য লক করা আছে। :(
রাইমুন্দাস সাকালাউস্কাস

7
পরিবর্তে স্থাপনের overrideUserInterfaceStyleমধ্যে viewDidLoadযে দৃশ্য নিয়ামক, আপনি এটি একবার অ্যাপের প্রধান উইন্ডোতে সেট করতে পারেন। আপনি যদি পুরো অ্যাপটি একভাবে আচরণ করতে চান তবে এত সহজ।
rmaddy

2
ব্যবহার করুন #if compiler(>=5.1)পরিবর্তে responds(to:)এবংsetValue
NSLeader

162

"আইওএসের গা D় মোড বাস্তবায়ন করা" সম্পর্কিত অ্যাপল এর অধিবেশন অনুসারে ( https://developer.apple.com/videos/play/wwdc2019/214/ 31:13 থেকে শুরু করা) যেকোন দর্শন নিয়ন্ত্রককে বা দৃশ্যে সেট overrideUserInterfaceStyleকরা UIUserInterfaceStyleLightবা সম্ভব UIUserInterfaceStyleDark, যা ব্যবহৃত হবেtraitCollection কোনও সাবভিউ বা দেখার নিয়ামকের জন্য ।

ইতিমধ্যে SeanR উল্লেখ হিসাবে, আপনি সেট করতে পারেন UIUserInterfaceStyleকরতে Lightবা Darkআপনার পুরো অ্যাপের জন্য এটি পরিবর্তন করতে আপনার অ্যাপ্লিকেশনের plist ফাইলে।


17
আপনি যদি UIUserInterfaceStyle কী সেট করে থাকেন তবে অ্যাপ্লিকেশন স্টোরটিতে আপনার অ্যাপ্লিকেশনটি প্রত্যাখ্যান করা হবে
Sonius

2
অ্যাপল ITMS-90190 ত্রুটি কোড forums.developer.apple.com/thread/121028
PRASAD1240

11
প্রত্যাখ্যানটি সম্ভবত ঘটবে কারণ iOS 13 এসডিকে এখনও বিটা ছাড়েনি। আমি মনে করি Xcode 11 GM উপলব্ধ হওয়ার সাথে সাথে এটি কাজ করা উচিত work
dorbeetle

2
@ ডরবিটেল এটি সত্য নয়, আমি 1 মাস আগে এক্সকোড 10 এর মতো সফলভাবে এই অ্যাপটি দিয়ে আমার অ্যাপটি আপলোড করেছি The এটি নতুন ধরণের অ্যাপল কৌশল বলে মনে হচ্ছে।
স্টিভেন

1
এটি এখনও ঘটছে। এক্সকোড GM2 অ্যাপ্লিকেশন সাইনিংয়ের ত্রুটি ফিরিয়ে দিয়েছে। এক্সকোড 10.3 ফিরে এসেছে: "অবৈধ তথ্য.পলিট কী the
ইভজেন বোদুনভ

64

আপনি যদি এক্সকোড 11 বা তার পরে ব্যবহার না করে থাকেন (i, e iOS 13 বা তারপরে এসডিকে), আপনার অ্যাপ্লিকেশনটি স্বয়ংক্রিয়ভাবে অন্ধকার মোড সমর্থন করে নি। সুতরাং, ডার্ক মোড থেকে বেরিয়ে আসার দরকার নেই।

আপনি যদি Xcode 11 বা তার বেশি ব্যবহার করে থাকেন তবে সিস্টেমটি আপনার অ্যাপ্লিকেশানের জন্য স্বয়ংক্রিয়ভাবে ডার্ক মোড সক্ষম করেছে। আপনার পছন্দের উপর নির্ভর করে গা dark় মোড অক্ষম করার জন্য দুটি পদ্ধতি রয়েছে। আপনি এটি সম্পূর্ণরূপে অক্ষম করতে পারেন বা কোনও নির্দিষ্ট উইন্ডো, দর্শন বা দেখার জন্য নিয়ন্ত্রককে এটি নিষ্ক্রিয় করতে পারেন।

আপনার অ্যাপ্লিকেশনটির জন্য পুরো গা D় মোড অক্ষম করুন

আপনার অ্যাপ্লিকেশনটির তথ্য.প্লেস্ট ফাইলের UIUserInterfaceStyleমতো একটি মান সহ কীটি অন্তর্ভুক্ত করে আপনি অন্ধকার মোড অক্ষম করতে পারেন Light। এটি ব্যবহারকারীর পছন্দকে উপেক্ষা করে এবং আপনার অ্যাপ্লিকেশনটিতে সর্বদা হালকা উপস্থিতি প্রয়োগ করে।
হালকা হিসাবে UIUserInterfaceStyle

উইন্ডো, দেখুন, বা দেখুন কন্ট্রোলারের জন্য অন্ধকার মোড অক্ষম করুন

আপনি নিজের ইন্টারফেসটিকে সর্বদা হালকা বা গা dark় স্টাইলে প্রদর্শিত হতে বাধ্য করতে পারেন setting overrideUserInterfaceStyle যথাযথ উইন্ডোটির বৈশিষ্ট্য, দর্শন বা নিয়ামক প্রদর্শন ।

নিয়ন্ত্রকগুলি দেখুন:

override func viewDidLoad() {
    super.viewDidLoad()
    /* view controller’s views and child view controllers 
     always adopt a light interface style. */
    overrideUserInterfaceStyle = .light
}

দেখা হয়েছে:

// The view and all of its subviews always adopt light style.
youView.overrideUserInterfaceStyle = .light

জানলা:

/* Everything in the window adopts the style, 
 including the root view controller and all presentation controllers that 
 display content in that window.*/
window.overrideUserInterfaceStyle = .light

দ্রষ্টব্য: অ্যাপল আপনার অ্যাপ্লিকেশনটিতে ডার্ক মোড সমর্থন করার জন্য দৃ strongly়ভাবে উত্সাহ দেয়। সুতরাং, আপনি কেবল অস্থায়ীভাবে অন্ধকার মোড অক্ষম করতে পারেন।

এখানে আরও পড়ুন: আপনার আইওএস অ্যাপের জন্য একটি নির্দিষ্ট ইন্টারফেস স্টাইল নির্বাচন করা



27

আমি মনে করি আমি সমাধানটি খুঁজে পেয়েছি। আমি প্রথমে এটি ইউআইউসারআইন্টারফেস স্টাইল - ইনফরমেশন প্রোপার্টি লিস্ট এবং ইউআইউজারআইন্টারফেস স্টাইল - ইউআইকিট থেকে একসাথে ছুঁড়েছি , তবে এখন এটি আপনার আইওএস অ্যাপ্লিকেশনটির জন্য একটি নির্দিষ্ট ইন্টারফেস শৈলীর পছন্দ পছন্দ করে নথিবদ্ধ করেছে

আপনার info.plist, UIUserInterfaceStyle( ব্যবহারকারী ইন্টারফেস স্টাইল ) 1 এ সেট করুন (UIUserInterfaceStyle.light ) এ সেট করুন।

সম্পাদনা: ডর্বিটেলের উত্তর অনুসারে, আরও উপযুক্ত সেটিংস UIUserInterfaceStyleহতে পারে Light


2 তে মান নির্ধারণ করে অন্ধকার মোড প্রয়োগ করা কার্যকর হয় না:[UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
funkenstrahlen

3
এই কীটি প্লিস্টে রাখার ফলে একটি অ্যাপ স্টোর প্রত্যাখ্যান হবে।
হোস

1
অ্যাপস্টোর আর এই সম্পত্তিটি plist.info এ প্রত্যাখ্যান করে না। আমাদের অ্যাপ্লিকেশনটি ইতিমধ্যে অন্ধকার হওয়ার কারণে আমি "অন্ধকার" (মূলধনযুক্ত) রেখেছি। কোন সমস্যা নাই. এটি সঠিকভাবে আমাদের সিস্টেম নিয়ন্ত্রণগুলি ব্যবহার করতে দেয়।
নিকডনক

@ নিকডনক আমার ধারণা আপনি আপনার অ্যাপটি এক্সকোড 11 দিয়ে তৈরি করেছেন যা অ্যাপল প্রস্তাবিত।
ডনসং

1
হ্যা, আমি করেছিলাম. এটি অ্যাপল এই প্যারামিটারটি প্লিস্টটিতে স্বীকার করে না এমনটি পরিবর্তিত হয় না, যা আমি পরিষ্কার করার চেষ্টা করছিলাম।
নিকডনক

23

আপনি পুরো অ্যাপটি বেছে নিতে চাইলে উপরের উত্তরটি কাজ করে। আপনি যদি ইউআই আছে এমন লাইবটিতে কাজ করে থাকেন এবং আপনার কাছে .plist সম্পাদনা করার বিলাসিতা নেই, আপনি কোডের মাধ্যমেও এটি করতে পারেন।

আপনি যদি আইওএস 13 এসডিকে বিপরীতে সংকলন করে থাকেন তবে আপনি কেবল নীচের কোডটি ব্যবহার করতে পারেন:

সুইফট:

if #available(iOS 13.0, *) {
    self.overrideUserInterfaceStyle = .light
}

OBJ-সি:

if (@available(iOS 13.0, *)) {
    self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}

যাইহোক , আপনি যদি নিজের কোডটি আইওএস 12 এসডিকেও (যেটি এখনও সর্বাধিক সর্বশেষতম স্থিতিশীল এসডিকে রয়েছে) এর সাথে সংকলিত করতে চান তবে আপনার নির্বাচকদের ব্যবহার করা উচিত। নির্বাচকদের সাথে কোড:

সুইফ্ট (এক্সকোড এই কোডের জন্য সতর্কতা প্রদর্শন করবে, তবে এসডিকে 12 তে সম্পত্তি বিদ্যমান না হওয়ায় এখনই এটি করার একমাত্র উপায় তাই সংকলন করবে না):

if #available(iOS 13.0, *) {
    if self.responds(to: Selector("overrideUserInterfaceStyle")) {
        self.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}

OBJ-সি:

if (@available(iOS 13.0, *)) {
    if ([self respondsToSelector:NSSelectorFromString(@"overrideUserInterfaceStyle")]) {
        [self setValue:@(UIUserInterfaceStyleLight) forKey:@"overrideUserInterfaceStyle"];
    }
}

সম্পত্তিটি কী তা নির্দিষ্ট করে দিলে ভাল হবে overrideUserInterfaceStyle
ডনসং

12

সর্বশেষ আপডেট-

আপনি Xcode 10.x ব্যবহার করেন, তাহলে তারপরে ডিফল্ট UIUserInterfaceStyleহল lightআইওএস 13.x. জন্য যখন কোনও আইওএস 13 ডিভাইসে চালিত হয়, এটি কেবল হালকা মোডে কাজ করবে।

UIUserInterfaceStyleতথ্য.প্লেস্ট ফাইলটিতে কীটি স্পষ্টভাবে যুক্ত করার দরকার নেই , এটি যুক্ত করার ফলে আপনি আপনার অ্যাপ্লিকেশনটিকে যাচাই করবেন এমন সময় একটি ত্রুটি ঘটবে:

অবৈধ তথ্য.পলিট কী। পে-লোড / অ্যাপনাম.এপআইএনফো.পিস্টলিস্ট ফাইলের 'UIUserInterfaceStyle' কীটি বৈধ নয়।

UIUserInterfaceStyleএক্সকোড ১১.x ব্যবহার করার সময় কেবল তথ্য.পলিট ফাইলটিতে কী যুক্ত করুন।


1
এটি এক্সকোড 10 বা ১১ এর সাথে কোনও সম্পর্কযুক্ত নয় user আপনাকে এক্সকোড 11 এ আপডেট করতে হবে এবং এই সমস্যাটির সমাধান করতে হবে।
নিরঞ্জন মোলকেরি

3
@ নীরঞ্জনমলকেরি নতুন আইফোনের সাথে এর কোন যোগসূত্র নেই। এটি আইওএস ১৩-এ ডার্ক মোড সম্পর্কে previous আগের আইওএসে 13 বিটা সংস্করণ অ্যাপ্লিকেশন ইউআই-তে স্পষ্টভাবে পরিচালনা না করা হলে ডার্ক মোড সমস্যা ছিল। তবে সর্বশেষতম সংস্করণে, এটি স্থির করা হয়েছে। আপনি যদি এক্সকোড 10 ব্যবহার করেন তবে ডিফল্ট ইউআইইউসারআইন্টারফেস স্টাইলটি আইওএস 13 এর জন্য হালকা। আপনি যদি Xode11 ব্যবহার করছেন তবে আপনার এটি পরিচালনা করা দরকার।
কুমারসিদ্ধার্থ 123

আপনি যদি এক্সকোড 10.3 ব্যবহার করে টেস্টফ্লিংথটিতে একটি অ্যাপ্লিকেশন আপলোড করেন তবে সমস্যাগুলি হবে the এটি বলবে যে এটি একটি অবৈধ প্লিস্ট ফাইল।
এক্সকোড

9

আপনি যদি UIUserInterfaceStyleপ্লাস্ট ফাইলটিতে কী যুক্ত করেন , সম্ভবত অ্যাপল এখানে উল্লিখিত হিসাবে রিলিজ বিল্ডটিকে প্রত্যাখ্যান করবে: https://stackoverflow.com/a/56546554/7524146 যাইহোক এটি প্রতিটি ভিউকন্ট্রোলারকে স্পষ্টভাবে বলতে বিরক্তিকর self.overrideUserInterfaceStyle = .light। তবে আপনি একবারে নিজের মূল windowবস্তুর জন্য এই শান্তির কোডটি ব্যবহার করতে পারেন :

if #available(iOS 13.0, *) {
    if window.responds(to: Selector(("overrideUserInterfaceStyle"))) {
        window.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}

কেবল লক্ষ্য করুন আপনি এটি ভিতরে করতে পারবেন না application(application: didFinishLaunchingWithOptions:)কারণ এই নির্বাচক trueসেই প্রাথমিক পর্যায়ে প্রতিক্রিয়া জানাবে না । তবে আপনি এটি পরে করতে পারেন। আপনি যদি অ্যাপ্লিকেশনটিতে স্বয়ংক্রিয়ভাবে ইউআই শুরু করার পরিবর্তে আপনার অ্যাপ্লিকেশনটিতে কাস্টম AppPresenterবা AppRouterশ্রেণি ব্যবহার করছেন তবে এটি অত্যন্ত সহজ ।


9

আপনি এক্সকোড 11 এ পুরো অ্যাপ্লিকেশনটিতে ডার্ক মোডটি বন্ধ করতে পারেন :

  1. তথ্য.পল্লিস্ট যান
  2. বেলো যুক্ত করুন

    <key>UIUserInterfaceStyle</key>
    <string>Light</string>

তথ্য.পল্লিস্ট নীচের মত চেহারা হবে ...

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


1
কোনও কারণে Xcode সংস্করণ 11.3.1 (11C504) এর জন্য কাজ করে না
অ্যান্ড্রু

7

- পুরো অ্যাপের জন্য (উইন্ডো):

window!.overrideUserInterfaceStyle = .light

আপনি উইন্ডো থেকে পেতে পারেন SceneDelegate

- একক ভিউ কন্ট্রোলারের জন্য:

viewController.overrideUserInterfaceStyle = .light

আপনি যে কোনও সেট করতে পারেন viewControllerএমনকি ভিউ কন্ট্রোলারের মধ্যে এটি নিজেই করুন

- একক দেখার জন্য:

view.overrideUserInterfaceStyle = .light

আপনি যে কোনও সেট করতে পারেন view, এমনকি দেখার অভ্যন্তরে এটি নিজেই

আপনি if #available(iOS 13.0, *) { ,,, }যদি পূর্ববর্তী আইওএস সংস্করণগুলি সমর্থন করেন তবে আপনার ব্যবহারের প্রয়োজন হতে পারে ।


6

অন্যান্য প্রতিক্রিয়াগুলি বাদ দিয়ে, নিম্নলিখিতগুলি সম্পর্কে আমার বোঝাপড়া থেকে, আইওএস 13 এসডিকে (এক্সকোড 11 ব্যবহার করে) বিরুদ্ধে সংকলন করার সময় আপনাকে কেবল ডার্ক মোডের জন্য প্রস্তুত করতে হবে।

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

লিংক


2

হ্যাঁ আপনি নিম্নলিখিত কোডটি ভিউডিল্ডে যুক্ত করে এড়িয়ে যেতে পারেন:

if #available(iOS 13.0, *) {
        // Always adopt a light interface style.
        overrideUserInterfaceStyle = .light
    }

2

আমার অ্যাপটি এখন পর্যন্ত ডার্ক মোড সমর্থন করে না এবং হালকা অ্যাপ বারের রঙ ব্যবহার করে। আমি নিম্নলিখিত কীটি আমার সাথে যুক্ত করে স্ট্যাটাস বারের সামগ্রীটি গা dark় পাঠ্য এবং আইকনগুলিতে বাধ্য করতে সক্ষম হয়েছিল Info.plist:

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDarkContent</string>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

অন্যান্য সম্ভাব্য মানগুলি এখানে সন্ধান করুন: https://developer.apple.com/docamentation/uikit/uistatusbarstyle


2

উদ্দেশ্য-সি সংস্করণ

 if (@available(iOS 13.0, *)) {
        _window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
    }

1

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

প্রথম টিপ: ভিউকন্ট্রোলার স্টাইলকে ওভাররাইড করতে

আপনি দ্বারা ইউআইভিউউকন্ট্রোলারের ইন্টারফেস স্টাইলকে ওভাররাইড করতে পারেন

1: ওভাররাইডউজারআইন্টারফেস স্টাইল =। ডার্ক // ডার্ক মোডের জন্য

2: ওভাররাইডউজারআইন্টারফেস স্টাইল =। লাইট // হালকা মোডের জন্য

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        overrideUserInterfaceStyle = .light    
    }
}

দ্বিতীয় টিপ: তথ্য.পিস্টে একটি কী যুক্ত করা

কেবলমাত্র আপনি একটি নতুন কী যুক্ত করতে পারেন

UIUserInterfaceStyle

আপনার অ্যাপ্লিকেশন ইনফো.লিস্টে এবং এর মান হালকা বা গাark়তে সেট করে। এটি আপনার সরবরাহিত মানটির সাথে অ্যাপ্লিকেশন ডিফল্ট শৈলী ওভাররাইড করবে। আপনাকে ওভাররাইড ইউজারআইন্টারফেস স্টাইল = যোগ করতে হবে না। প্রতিটি ভিউকন্ট্রোলারে এই লাইনটি হালকা করুন, তথ্য.প্লেস্টের মধ্যে কেবল একটি লাইন it


1

কেবলমাত্র আপনার info.plistফাইলটিতে নিম্নলিখিত কী যুক্ত করুন:

<key>UIUserInterfaceStyle</key>
    <string>Light</string>

1
 if #available(iOS 13.0, *) {
            overrideUserInterfaceStyle = .light
        } else {
            // Fallback on earlier versions
        }

কেবল উত্তর কোড পোস্ট করার পরিবর্তে কীভাবে এই উত্তরটি সমস্যার সমাধান করবে তা আপনি কিছুটা ব্যাখ্যা করতে পারেন।
অরুণ বিনোথ

হ্যাঁ নিশ্চিত হোন @ অরুনভিনোথ আইওএস ১৩-এ অন্ধকার মোড চালু করা হয়েছে তাই যদি আপনার স্থাপনার লক্ষ্যমাত্রা ১৩ এর কম হয় তবে উপরের কোডটি ব্যবহার করুন অন্যথায় যদি আপনি ব্লক করে থাকেন তবে সরল বিবৃতি ব্যবহার করতে পারেন।
তালহা রসুল

0

আমি এই সমাধানটি ব্যবহার করব যেহেতু অ্যাপ লাইফ চক্র চলাকালীন উইন্ডো সম্পত্তি পরিবর্তন হতে পারে। সুতরাং "ওভাররাইডউজারআইন্টারফেস স্টাইল =। লাইট" বরাদ্দ করা দরকার। UIWindow.appearance () আমাদের নতুন তৈরি UIWindow অবজেক্টের জন্য ব্যবহৃত হবে এমন ডিফল্ট মান সেট করতে সক্ষম করে।

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      if #available(iOS 13.0, *) {
          UIWindow.appearance().overrideUserInterfaceStyle = .light
      }

      return true
    }
}

0

এই তথ্যগুলি.পলিট ফাইলটিতে কেবল যুক্ত করুন:

<key>UIUserInterfaceStyle</key>
<string>light</string>

এটি অ্যাপটিকে কেবল হালকা মোডে চলতে বাধ্য করবে।


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

0
import UIKit

extension UIViewController {

    override open func awakeFromNib() {

        super.awakeFromNib()

        if #available(iOS 13.0, *) {

            overrideUserInterfaceStyle = .light

        }

    }
}

2
আপনার উত্তরটি সম্পাদনা করে কিছু ব্যাখ্যা যুক্ত করুন, যাতে অন্যরা এটি শিখতে পারে
নিকো হাজেস

0

আপনি এটি করতে পারেন: এই নতুন কী UIUserInterfaceStyle ইনফো.পিস্টে যুক্ত করুন এবং এর মানটি আলোর কাছে সেট করুন। এবং চেক সতর্কতা নিয়ন্ত্রণকারী হালকা মোডের সাথে উপস্থিত হয়।

UIUserInterfaceStyle আলোক আপনার তথ্য.পালিস্ট ফাইলটিতে UIUserInterfaceStyle কীটি যুক্ত করে এবং এর মান হালকা বা গাark় হিসাবে নির্ধারণ করে ব্যবহারকারীর সেটিংস নির্বিশেষে আপনার পুরো অ্যাপ্লিকেশনটিতে হালকা / গা dark় মোড জোর করে চলেছেন।


0

এই প্রশ্নের অনেক উত্তর রয়েছে, বরং এটিতে এটি ব্যবহার করে info.plistআপনি এটির AppDelegateমতো এটি সেট করতে পারেন :

#if compiler(>=5.1)
        if #available(iOS 13.0, *) {
            self.window?.overrideUserInterfaceStyle = .light
        }
        #endif

এক্সকোড 11.3, আইওএস 13.3 এ পরীক্ষা করুন


0

সুইফট 5

হালকা মোডে অন্ধকার পরিবর্তন করার দুটি উপায়:

1- info.plist

    <key>UIUserInterfaceStyle</key>
    <string>Light</string>

2- প্রোগ্রামগতভাবে

 UIApplication.shared.windows.forEach { window in
     window.overrideUserInterfaceStyle = .light
  } 

-8

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

ব্যবহারকারীর পছন্দটি ভাল (আহেম, আপনাকে অ্যাপলের দিকে তাকিয়ে, আপনার কীভাবে এটি প্রয়োগ করা উচিত ছিল)।

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

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

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

এখন, আপনার বিশাল অ্যাপ্লিকেশনটিতে প্রতিটি একক এমএফআইএন ভিউকন্ট্রোলারের অন্ধকার মোড বন্ধ করার চেষ্টা করা যথেষ্ট নয়। আপনি যদি রঙ সম্পদ ব্যবহার করেন তবে আপনাকে পুরোপুরি বোনড করা হবে। আমরা 10+ বছরের জন্য অপরিবর্তনীয় বস্তুগুলি অপরিবর্তনীয় হতে বুঝতে পেরেছি। রঙ সম্পদ ক্যাটালগ থেকে আপনি যে রঙগুলি পেয়েছেন সেগুলি বলে যে তারা ইউআইক্লোর তবে তারা গতিশীল (পরিবর্তনযোগ্য) রঙ এবং সিস্টেমটি অন্ধকার থেকে হালকা মোডে পরিবর্তিত হওয়ার সাথে সাথে আপনার নীচে পরিবর্তন হবে। এটি একটি বৈশিষ্ট্য বলে মনে করা হচ্ছে। তবে অবশ্যই এই পরিবর্তনগুলি বন্ধ করতে এই জিনিসগুলিকে জিজ্ঞাসা করার জন্য কোনও মাস্টার টগল নেই (যতদূর আমি জানি এখনই হয়তো কেউ এটিকে উন্নতি করতে পারে)।

সুতরাং সমাধানটি দুটি অংশে রয়েছে:

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

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

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

ইউআইকলার বিভাগটি প্রকাশের দরকার নেই, এটি কেবল রঙিন নেমেড কল করতে কাজ করে: ... আপনি যদি ডার্কমোড ভিউকন্ট্রোলার শ্রেণিকে অন্ধকার মোড ব্লক করতে না বলেন, এটি প্রত্যাশার মতো পুরোপুরি সুন্দরভাবে কাজ করবে। স্ট্যান্ডার্ড অ্যাপল স্প্যাগেটি কোডের পরিবর্তে মার্জিত কিছু তৈরি করার চেষ্টা করছে যা বোঝা যাচ্ছে যে আপনি যদি ক্রমবর্ধমানভাবে অন্ধকার মোড থেকে বেরিয়ে আসতে চান বা এটি টগল করতে চান তবে আপনার বেশিরভাগ অ্যাপ্লিকেশনটি আপনাকে পরিবর্তন করতে হবে। প্রয়োজন মতো অন্ধকার মোড বন্ধ করার জন্য তথ্য.প্লেস্টকে পরিবর্তন করার আরও ভাল উপায় যদি এখন আমি জানি না। আমার বোধগম্যতা হ'ল এটি একটি সংকলন সময় বৈশিষ্ট্য এবং তারপরে আপনাকে ধর্ষণ করা হবে।

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

সুষ্ঠ সতর্কতা আমি এআরসি বা অন্য কোনও হ্যান্ডহোল্ডিং পদ্ধতি ব্যবহার করি না।

////// H file

#import <UIKit/UIKit.h>

@interface UIViewController(DarkMode)

// if you want to globally opt out of dark mode you call these before any view controllers load
// at the moment they will only take effect for future loaded view controllers, rather than currently
// loaded view controllers

// we are doing it like this so you don't have to fill your code with @availables() when you include this
typedef enum {
    QOverrideUserInterfaceStyleUnspecified,
    QOverrideUserInterfaceStyleLight,
    QOverrideUserInterfaceStyleDark,
} QOverrideUserInterfaceStyle;

// the opposite condition is light interface mode
+ (void)setOverrideUserInterfaceMode:(QOverrideUserInterfaceStyle)override;
+ (QOverrideUserInterfaceStyle)overrideUserInterfaceMode;

// utility methods
// this will tell you if any particular view controller is operating in dark mode
- (BOOL)isUsingDarkInterfaceStyle;
// this will tell you if any particular view controller is operating in light mode mode
- (BOOL)isUsingLightInterfaceStyle;

// this is called automatically during all view controller loads to enforce a single style
- (void)tryToOverrideUserInterfaceStyle;

@end


////// M file


//
//  QDarkMode.m

#import "UIViewController+DarkMode.h"
#import "q-runtime.h"


@implementation UIViewController(DarkMode)

typedef void (*void_method_imp_t) (id self, SEL cmd);
static void_method_imp_t _nativeViewDidLoad = NULL;
// we can't @available here because we're not in a method context
static long _override = -1;

+ (void)load;
{
#define DEFAULT_UI_STYLE UIUserInterfaceStyleLight
    // we won't mess around with anything that is not iOS 13 dark mode capable
    if (@available(iOS 13,*)) {
        // default setting is to override into light style
        _override = DEFAULT_UI_STYLE;
        /*
         This doesn't work...
        NSUserDefaults *d = NSUserDefaults.standardUserDefaults;
        [d setObject:@"Light" forKey:@"UIUserInterfaceStyle"];
        id uiStyle = [d objectForKey:@"UIUserInterfaceStyle"];
        NSLog(@"%@",uiStyle);
         */
        if (!_nativeViewDidLoad) {
            Class targetClass = UIViewController.class;
            SEL targetSelector = @selector(viewDidLoad);
            SEL replacementSelector = @selector(_overrideModeViewDidLoad);
            _nativeViewDidLoad = (void_method_imp_t)QMethodImplementationForSEL(targetClass,targetSelector);
            QInstanceMethodOverrideFromClass(targetClass, targetSelector, targetClass, replacementSelector);
        }
    }
}

// we do it like this because it's not going to be set often, and it will be tested often
// so we can cache the value that we want to hand to the OS
+ (void)setOverrideUserInterfaceMode:(QOverrideUserInterfaceStyle)style;
{
    if (@available(iOS 13,*)){
        switch(style) {
            case QOverrideUserInterfaceStyleLight: {
                _override = UIUserInterfaceStyleLight;
            } break;
            case QOverrideUserInterfaceStyleDark: {
                _override = UIUserInterfaceStyleDark;
            } break;
            default:
                /* FALLTHROUGH - more modes can go here*/
            case QOverrideUserInterfaceStyleUnspecified: {
                _override = UIUserInterfaceStyleUnspecified;
            } break;
        }
    }
}
+ (QOverrideUserInterfaceStyle)overrideUserInterfaceMode;
{
    if (@available(iOS 13,*)){
        switch(_override) {
            case UIUserInterfaceStyleLight: {
                return QOverrideUserInterfaceStyleLight;
            } break;
            case UIUserInterfaceStyleDark: {
                return QOverrideUserInterfaceStyleDark;
            } break;
            default:
                /* FALLTHROUGH */
            case UIUserInterfaceStyleUnspecified: {
                return QOverrideUserInterfaceStyleUnspecified;
            } break;
        }
    } else {
        // we can't override anything below iOS 12
        return QOverrideUserInterfaceStyleUnspecified;
    }
}

- (BOOL)isUsingDarkInterfaceStyle;
{
    if (@available(iOS 13,*)) {
        if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark){
            return YES;
        }
    }
    return NO;
}

- (BOOL)isUsingLightInterfaceStyle;
{
    if (@available(iOS 13,*)) {
        if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleLight){
            return YES;
        }
        // if it's unspecified we should probably assume light mode, esp. iOS 12
    }
    return YES;
}

- (void)tryToOverrideUserInterfaceStyle;
{
    // we have to check again or the compile will bitch
    if (@available(iOS 13,*)) {
        [self setOverrideUserInterfaceStyle:(UIUserInterfaceStyle)_override];
    }
}

// this method will be called via the viewDidLoad chain as we will patch it into the
// UIViewController class
- (void)_overrideModeViewDidLoad;
{
    if (_nativeViewDidLoad) {
        _nativeViewDidLoad(self,@selector(viewDidLoad));
    }
    [self tryToOverrideUserInterfaceStyle];
}


@end

// keep this in the same file, hidden away as it needs to switch on the global ... yeah global variables, I know, but viewDidLoad and colorNamed: are going to get called a ton and already it's adding some inefficiency to an already inefficient system ... you can change if you want to make it a class variable. 

// this is necessary because UIColor will also check the current trait collection when using asset catalogs
// so we need to repair colorNamed: and possibly other methods
@interface UIColor(DarkMode)
@end

@implementation UIColor (DarkMode)

typedef UIColor *(*color_method_imp_t) (id self, SEL cmd, NSString *name);
static color_method_imp_t _nativeColorNamed = NULL;
+ (void)load;
{
    // we won't mess around with anything that is not iOS 13 dark mode capable
    if (@available(iOS 13,*)) {
        // default setting is to override into light style
        if (!_nativeColorNamed) {
            // we need to call it once to force the color assets to load
            Class targetClass = UIColor.class;
            SEL targetSelector = @selector(colorNamed:);
            SEL replacementSelector = @selector(_overrideColorNamed:);
            _nativeColorNamed = (color_method_imp_t)QClassMethodImplementationForSEL(targetClass,targetSelector);
            QClassMethodOverrideFromClass(targetClass, targetSelector, targetClass, replacementSelector);
        }
    }
}


// basically the colors you get
// out of colorNamed: are dynamic colors... as the system traits change underneath you, the UIColor object you
// have will also change since we can't force override the system traits all we can do is force the UIColor
// that's requested to be allocated out of the trait collection, and then stripped of the dynamic info
// unfortunately that means that all colors throughout the app will be static and that is either a bug or
// a good thing since they won't respond to the system going in and out of dark mode
+ (UIColor *)_overrideColorNamed:(NSString *)string;
{
    UIColor *value = nil;
    if (@available(iOS 13,*)) {
        value = _nativeColorNamed(self,@selector(colorNamed:),string);
        if (_override != UIUserInterfaceStyleUnspecified) {
            // the value we have is a dynamic color... we need to resolve against a chosen trait collection
            UITraitCollection *tc = [UITraitCollection traitCollectionWithUserInterfaceStyle:_override];
            value = [value resolvedColorWithTraitCollection:tc];
        }
    } else {
        // this is unreachable code since the method won't get patched in below iOS 13, so this
        // is left blank on purpose
    }
    return value;
}
@end

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

// q-runtime.h

#import <Foundation/Foundation.h>
#import <objc/message.h>
#import <stdatomic.h>

// returns the method implementation for the selector
extern IMP
QMethodImplementationForSEL(Class aClass, SEL aSelector);

// as above but gets class method
extern IMP
QClassMethodImplementationForSEL(Class aClass, SEL aSelector);


extern BOOL
QClassMethodOverrideFromClass(Class targetClass, SEL targetSelector,
                              Class replacementClass, SEL replacementSelector);

extern BOOL
QInstanceMethodOverrideFromClass(Class targetClass, SEL targetSelector,
                                 Class replacementClass, SEL replacementSelector);


// q-runtime.m

static BOOL
_QMethodOverride(Class targetClass, SEL targetSelector, Method original, Method replacement)
{
    BOOL flag = NO;
    IMP imp = method_getImplementation(replacement);
    // we need something to work with
    if (replacement) {
        // if something was sitting on the SEL already
        if (original) {
            flag = method_setImplementation(original, imp) ? YES : NO;
            // if we're swapping, use this
            //method_exchangeImplementations(om, rm);
        } else {
            // not sure this works with class methods...
            // if it's not there we want to add it
            flag = YES;
            const char *types = method_getTypeEncoding(replacement);
            class_addMethod(targetClass,targetSelector,imp,types);
            XLog_FB(red,black,@"Not sure this works...");
        }
    }
    return flag;
}

BOOL
QInstanceMethodOverrideFromClass(Class targetClass, SEL targetSelector,
                                 Class replacementClass, SEL replacementSelector)
{
    BOOL flag = NO;
    if (targetClass && replacementClass) {
        Method om = class_getInstanceMethod(targetClass,targetSelector);
        Method rm = class_getInstanceMethod(replacementClass,replacementSelector);
        flag = _QMethodOverride(targetClass,targetSelector,om,rm);
    }
    return flag;
}


BOOL
QClassMethodOverrideFromClass(Class targetClass, SEL targetSelector,
                              Class replacementClass, SEL replacementSelector)
{
    BOOL flag = NO;
    if (targetClass && replacementClass) {
        Method om = class_getClassMethod(targetClass,targetSelector);
        Method rm = class_getClassMethod(replacementClass,replacementSelector);
        flag = _QMethodOverride(targetClass,targetSelector,om,rm);
    }
    return flag;
}

IMP
QMethodImplementationForSEL(Class aClass, SEL aSelector)
{
    Method method = class_getInstanceMethod(aClass,aSelector);
    if (method) {
        return method_getImplementation(method);
    } else {
        return NULL;
    }
}

IMP
QClassMethodImplementationForSEL(Class aClass, SEL aSelector)
{
    Method method = class_getClassMethod(aClass,aSelector);
    if (method) {
        return method_getImplementation(method);
    } else {
        return NULL;
    }
}

আমি এই ফাইলটি একাধিক ফাইলের মধ্যে অনুলিপি এবং আটকানো করছি যেহেতু q-runtime.h আমার পুনরায় ব্যবহারযোগ্য লাইব্রেরি এবং এটি এটির একটি অংশ মাত্র। যদি কিছু সংকলন না করে তবে আমাকে জানান।


আপনি যখন এটি UIColor আচরণ নিয়ন্ত্রণ আসে, যেমন এই প্রশ্ন আলোচনা ভাগ্য আউট নয়: stackoverflow.com/questions/56487679/...
raven_raven
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.