iphone - iOS 5: UIAppearance के बारे में उत्सुक




objective-c cocoa-touch (2)

टेक टॉक 2011 में मैंने नए UIAppearance protocol बारे में एक भाषण देखा। वहाँ अभी तक बहुत सारे प्रलेखन नहीं है। मैं शीघ्र ही संक्षेप में बताऊंगा कि मुझे क्या याद करना है कि मेरा प्रश्न कहाँ से आया है:

UIAppearance बारे में:

अब तक आपको अपने सभी ऐप व्यू कंट्रोलर्स में हर जगह नेविगेशन बार (टूलबार इत्यादि) को कस्टमाइज करना था। नई उपस्थिति संपत्ति के साथ आप इसे अपने ऐप में सभी नेविगेशन बार के लिए केवल एक ही स्थान पर कर सकते हैं। उदाहरण के लिए: यदि आप अपनी नेविगेशन बार पृष्ठभूमि छवि को अनुकूलित करना चाहते हैं, तो आप इसे इस तरह कर सकते हैं:

[[UINavigationBar appearance] setBackgroundImage:
   [UIImage imageNamed:@"MyImageName"] forBarMetrics:UIBarMetricsDefault]; 

यह आपके एप्लिकेशन के भीतर सभी नेविगेशन बार की पृष्ठभूमि छवि सेट करेगा। barMetrics साथ आप यह निर्दिष्ट करते हैं कि आप चाहते हैं कि छवि का उपयोग लैंडस्केप मोड में भी किया जाए या नहीं।

यदि आप केवल कुछ दृश्य नियंत्रकों में लागू होने वाली उपस्थिति को निर्दिष्ट करना चाहते हैं, तो डॉक्स में एक विधि यह भी है कि यह नियंत्रित करने के लिए कि आपकी वस्तुएं कहां स्थित हैं:

[[UIBarButtonItem appearanceWhenContainedIn:
    [ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];

यह भी उल्लेख के लायक है, यदि आपके पास एकल अनुकूलित उदाहरण हैं, तो आपकी उपस्थिति सेटिंग्स से भिन्न, थिसेस इंस्टेंस को उपस्थिति प्रॉक्सी से प्रभावित नहीं किया जाएगा।

कुछ सवाल:

क) मुझे कैसे पता चलेगा कि उपस्थिति गुण के साथ एक वर्ग के कौन से गुण काम करते हैं? उदाहरण के लिए चूंकि UITableView UIAppearance प्रोटोकॉल के अनुरूप है, मैं सोच रहा था कि मैं कुछ ऐसा कर सकता हूं

[[UITableView appearance] setBackgroundColor:mytableViewColor];

मेरे सभी तालिका विचारों की पृष्ठभूमि के रंग में हेरफेर करने के लिए, लेकिन मैं नहीं कर सकता!

बी) क्या उपस्थिति संपत्ति के साथ छेड़छाड़ करने वाले सभी वर्गों की एक सूची है?

ग) उपस्थिति अनुकूलन को किस बिंदु पर बुलाया जा रहा है? मैं बदलाव करने की उम्मीद कर रहा था कि रनटाइम में उपस्थिति संपत्ति को फेंक दिया जाए, लेकिन दुर्भाग्य से बदलाव नहीं हो रहे हैं।


क) मुझे कैसे पता चलेगा कि किस वर्ग की उपस्थिति संपत्ति के साथ काम करती है? उदाहरण के लिए चूंकि UITableView UIAppearance प्रोटोकॉल के अनुरूप है, मैं सोच रहा था कि मैं कुछ ऐसा कर सकता हूं

आप क्लास के हेडर में दिखते हैं (और सभी सुपरक्लास के हेडर)। किसी भी विधि के पास UI_APPEARANCE_SELECTOR है जो UIAppearance प्रॉक्सी के साथ उपयोग के लिए समर्थित है।

[[UITableView appearance] setBackgroundColor:mytableViewColor];

backgroundColor संपत्ति UI_APPEARANCE_SELECTOR में UIView.h सजाया नहीं गया है। इस प्रकार यह उपस्थिति प्रॉक्सी के साथ उपयोग के लिए तकनीकी रूप से समर्थित नहीं है। यह शायद काम करेगा, लेकिन (विधि सजावट की कमी को देखते हुए) इसकी गारंटी नहीं है।

UIAppearance Protocol Reference :

उपस्थिति अनुकूलन का समर्थन करने के लिए, एक वर्ग को UIAppearanceContainer प्रोटोकॉल के अनुरूप होना चाहिए और संबंधित UIAppearanceContainer विधियों को UI_APPEARANCE_SELECTOR के साथ चिह्नित किया जाना चाहिए।

(ध्यान दें " और प्रासंगिक एक्सेसर विधियों को चिह्नित किया जाना चाहिए ..." [जोर जोड़ा])

बी) क्या उन सभी संपत्तियों की सूची है जो उपस्थिति संपत्ति के साथ छेड़छाड़ कर रहे हैं?

क्या प्रत्येक सेटर को एक ही पृष्ठ दिखाई दे रहा है जो उपस्थिति प्रॉक्सी के साथ काम करता है? मुझे एक का पता नहीं है, न ही रनटाइम पर सूची बनाने का कोई तरीका है।

ग) उपस्थिति अनुकूलन को किस बिंदु पर बुलाया जा रहा है? मैं बदलाव करने की उम्मीद कर रहा था कि रनटाइम में उपस्थिति संपत्ति को फेंक दिया जाए, लेकिन दुर्भाग्य से बदलाव नहीं हो रहे हैं।

निष्पादन के दौरान आप किसी भी बिंदु पर उपस्थिति प्रॉक्सी का उपयोग कर सकते हैं। अगली बार जब तक उन विचारों को उनके -layoutSubviews विधि को लागू नहीं किया जाता है तब तक प्रभावित विचारों पर परिवर्तन लागू नहीं होंगे।


a: निम्न पंक्ति

 [[UITableView appearance] setBackgroundColor:[UIColor blueColor]];

हर तालिका को नीला बना देगा! बस iOS 5 सिम्युलेटर पर परीक्षण किया गया।

बी: UIAppearance को हर संपत्ति पर एक UIView पर काम करना चाहिए। UIView सभी उपवर्ग UIAppearance Protocol अनुरूप हैं

c: मुझे लगता है कि सबसे अधिक एक वर्ग और विधि का निर्माण होगा जो उपस्थिति को अनुकूलित करेगा और इसे इसमें कॉल करेगा:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

कुछ इस तरह: [ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];

संपादित करें:

उदाहरण के लिए, UIBarButtonItem इन विधियों को परिभाषित करता है:

@property (नॉनटॉमिक, रिटेन) UIColor * tintColor UI_APPEARANCE_SELECTOR;

UIAppearanceContainer प्रोटोकॉल संदर्भ से

और UIBarButtonItem क्लास संदर्भ में tintColor को परिभाषित किया गया है

@property (नॉनटॉमिक, रिटेन) UIColor * tintColor

लेकिन UIBarButtonItem.h में परिभाषित किया गया है:

@property(nonatomic,retain) UIColor *tintColor __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0) UI_APPEARANCE_SELECTOR;

मुझे लगता है कि डॉक्स आज तक नहीं हैं।