दिलचस्प पोस्ट
मैं mysql में कैस्केड को कैसे हटाऊं? दो क्रमबद्ध सरणियों के संघ में सबसे छोटी तत्व कैसे मिल जाए? क्या सीएमएडी में अनिर्दिष्ट किसी यूनियन के माध्यम से प्रकार-छेड़छाड़ की जाती है, और क्या यह सी 11 में निर्दिष्ट हो गया है? मैं यूआईएलबल में टेक्स्ट के उपस्ट्रिंग के लिए CGRect कैसे खोजूं? बाइट जावा में फाइल करने के लिए जावास्क्रिप्ट: क्या मुझे ऑब्जेक्ट में हर वैरिएबल के लिए this.var डालनी है? रेल 3 सक्रियरेकॉर्ड: एसोसिएशन पर गिनती से आदेश क्या उनके मूल तत्व के नीचे छद्म तत्वों के ढेर क्रम को सेट करना संभव है? प्रीपेड डबल कॉलन "::" का क्या अर्थ है? अंतिम स्वच्छ / सुरक्षित फ़ंक्शन AngularJ में शब्दकोशों के लिए एनजी-दोहर का उपयोग कैसे करें? नियमित अभिव्यक्ति में "पात्रों के इस क्रम तक कुछ भी" कैसे मिलान किया जाए? हल करने में विफल: com.android.support:cardview-v7:26.0.0 एंड्रॉइड किसी तारीख में एक दिन कैसे जोड़ें? एमईएफ और एमएएफ (सिस्टम.एडइन) के बीच चयन करना

कस्टम यूनाइविगेशनबार पृष्ठभूमि

मैं अपने संपूर्ण नेविगेशनबार (केवल शीर्षक दृश्य) के लिए कस्टम पृष्ठभूमि सेट अप करने की कोशिश कर रहा हूं, लेकिन संघर्ष कर रहा हूं।

मैंने यह धागा पाया

http://discussions.apple.com/thread.jspa?threadID=1649012&tstart=0

लेकिन मुझे यकीन नहीं है कि दिए गए कोड स्निपेट को कैसे लागू किया जाए। क्या कोड को एक नये वर्ग के रूप में लागू किया गया है? साथ ही जहां मैं नेविगेशन व्यू टेम्प्लेट के साथ बनाया गया एक अनुप्रयोग है, वहां यूआईएवीएजिएन्ट्रॉलर को कैसे इंस्टाटेट कर सकता हूं, उदाहरण के अनुसार यह मेरे रूट कंट्रोलर में नहीं किया गया है

वेब के समाधान से एकत्रित समाधान "कस्टम यूनाइविगेशनबार पृष्ठभूमि"

आपको केवल ड्रॉ को ओवरलोड करना होगा जैसे:

 @implementation UINavigationBar (CustomImage) - (void)drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed: @"NavigationBar.png"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end 

उद्धव और लेफ्ला सही हैं यह कोड अच्छी तरह से काम करता है:

 @interface CustomNavigationBar : UINavigationBar @end @implementation CustomNavigationBar -(void) drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed: @"myNavBarImage"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end // this can go anywhere +(UINavigationController*) myCustomNavigationController { MyViewController *vc = [[[MyViewController alloc] init] autorelease]; UINavigationController *nav = [[[NSBundle mainBundle] loadNibNamed:@"CustomNavigationController" owner:self options:nil] objectAtIndex:0]; nav.viewControllers = [NSArray arrayWithObject:vc]; return nav; } 

आपको CustomNavigationController.xib बना दिया है और इसमें एक UINavigationController डालकर नेविगेशनबार वर्ग को "कस्टमनैविगेशनबार" में बदलना होगा।

IOS 5.xx में UINavigationBar , UIToolBar आदि जैसे पृष्ठभूमि और अन्य स्टाइलिंग गुणों को बदलने के लिए आपको 'उपस्थिति' प्रॉक्सी का उपयोग करना चाहिए। हालांकि, ये पिछली संगतता के लिए आईओएस 4.xx के लिए उपलब्ध नहीं हैं, आपको एक हाइब्रिड समाधान की आवश्यकता है।

यदि आप आईओएस 4.xx और आईओएस 5.xx दोनों डिवाइसों का समर्थन करना चाहते हैं (अर्थात आपका DeploymentTarget टार्गेट 4.xx है), तो आपको रनटाइम पर चेक करके उपस्थिति प्रॉक्सी के कॉल को लपेटने में सावधान रहना चाहिए यदि 'उपस्थिति' चयनकर्ता मौजूद है या नहीं।

आप ऐसा कर सकते हैं:

 //Customize the look of the UINavBar for iOS5 devices if ([[UINavigationBar class]respondsToSelector:@selector(appearance)]) { [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"NavigationBar.png"] forBarMetrics:UIBarMetricsDefault]; } 

आपको आईओएस 4.xx समाधान भी छोड़ना चाहिए, जिसे आपने कार्यान्वित किया हो। यदि आपने आईओएस 4.xx उपकरणों के लिए ड्रॉरेक्टेक्ट वर्राअराउंड कार्यान्वित किया है, जैसा कि @ लुडविग्सचुबर्ट द्वारा उल्लिखित है, तो आपको उसमें छोड़ देना चाहिए:

 @implementation UINavigationBar (BackgroundImage) //This overridden implementation will patch up the NavBar with a custom Image instead of the title - (void)drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed: @"NavigationBar.png"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end 

यह NavBar दोनों आईओएस 4 और आईओएस 5 उपकरणों में एक ही दिख पाएगा।

एक श्रेणी को लागू करना उचित नहीं है। आईओएस 5 इस मुद्दे के लिए राहत प्रदान कर सकता है। लेकिन पुराने एपीआई के लिए, आप कर सकते हैं –

  1. उप-वर्ग UINavigationBar कस्टम CustomNavBar कहने के लिए और लिथियम के जवाब से कस्टम drawRect को लागू करने के लिए।
  2. सभी आईबी आधारित CustomNavBar लिए, अपने CustomNavBar के लिए कस्टम क्लास के रूप में CustomNavBar उपलब्ध CustomNavBar
  3. सभी कोड आधारित UINavigationControllers के लिए एक UINAVigationController के साथ एक XIB बनाएँ और दो कदम दो। फिर कोड में एक फैक्टरी पद्धति प्रदान करें जो कि निब से UINavigationController को लोड करता है और एक IBOutlet प्रदान करता है।

उदाहरण के लिए।

 [[NSBundle mainBundle] loadNibNamed:@"CustomNavigationController" owner:self options:nil]; UINavigationController *navController = self.customNavigationController; navController.viewControllers = [NSArray arrayWithObject:controller] 

आप drawLayer:inContext: ओवरराइड भी कर सकते हैं drawLayer:inContext: एक drawLayer:inContext: श्रेणी वर्ग में विधि। drawLayer:inContext: अंदर drawLayer:inContext: विधि, आप उस पृष्ठभूमि चित्र को आकर्षित कर सकते हैं जिसे आप उपयोग करना चाहते हैं।

 - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context { if ([self isMemberOfClass:[UINavigationBar class]] == NO) { return; } UIImage *image = (self.frame.size.width > 320) ? [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait]; CGContextClip(context); CGContextTranslateCTM(context, 0, image.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage); } 

और UINavigationBar की उपस्थिति को अनुकूलित करने पर एक पूर्ण डेमो Xcode प्रोजेक्ट के रूप में और यह सहायक हो सकता है।

आईओएस 5 में एक श्रेणी का क्रियान्वयन नहीं होगा, आईओएस 5 पर कस्टमनबार का उपयोग करने के लिए उद्धव कांबली की सलाह का उपयोग करना चाहिए।

मैं इस ब्लॉग प्रविष्टि को सिर्फ इस विषय का बहुत सरल वर्णन करता हूं: http://web0.at/blog/?p=38

यह मुझे बहुत मदद की, वे पृष्ठभूमि का अनुकूलन प्राप्त करने के लिए "ड्रॉरेक्ट" विधि का उपयोग करते हैं।

जिन सभी लोगों को आईओएस 5 में UINavigationBar कस्टम पृष्ठभूमि के साथ परेशानी हो रही है, उनको इसी व्यूडिडलोड विधियों में करें:

 #if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0 if ([self.navigationController.navigationBar respondsToSelector:@selector( setBackgroundImage:forBarMetrics:)]){ [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"TitleBar"] forBarMetrics:UIBarMetricsDefault]; } #endif 

ध्यान दें कि मेरे मामले में, पृष्ठभूमि छवि का नाम "TitleBar" था आप अपनी कस्टम पृष्ठभूमि छवि का नाम जो भी डाल सकते हैं।

आपकी समस्या यह है कि यदि आप नेविगेशन नियंत्रक का उपयोग करते हैं, तो प्रत्येक पृष्ठ का शीर्षक आपके कस्टम नौबार को ओवरले करेगा अगर आपके नवबार में लोगो या आपके ऐप का नाम है, तो यह स्पष्ट रूप से अस्वीकार्य है।

आप अपने नेविगेशन स्टैक में प्रत्येक दृश्य का शीर्षक रिक्त करने के लिए सेट कर सकते हैं, लेकिन कुछ विचार एक शीर्षक के लिए मजबूर करते हैं कि आप (जैसे फ़ोटो पिकर) के बारे में कुछ भी नहीं कर सकते। इसलिए हो सकता है कि आप अपने लोगो नेवबार के समान रंग या डिज़ाइन के साथ एक वैकल्पिक नौबारिका छवि बनाना चाहते हों, लेकिन अधिक मात्रा में खिताब के लिए जगह बनाने के लिए रिक्त क्षेत्र के साथ।

इच्छा पर नवब्बार छवियों को स्विच करने के लिए, नौबार की छवि का नाम रखने के लिए अपने ऐप प्रतिनिधि को एक संपत्ति जोड़ें और इन दोनों के साथ ऊपर दिए गए पहले उदाहरण की पहली पंक्ति को बदलें:

  YourAppDelegate* theApp = (YourAppDelegate*)[[UIApplication sharedApplication] delegate]; UIImage* image = [UIImage imageNamed:theApp.navBarName]; 

फिर पहले दृश्य नियंत्रक में आप नेविगेशन स्टैक पर पुश करेंगे, ऐसा कुछ करें:

 - (void)viewWillAppear:(BOOL)animated { YourAppDelegate* theApp = (YourAppDelegate*)[[UIApplication sharedApplication] delegate]; theApp.navBarName = @"navBar_plain"; } 

फिर रूट व्यू नियंत्रक में, एक ही काम करें लेकिन अपने लोगो-असर navbar छवि को निर्दिष्ट करें, इसलिए जब उपयोगकर्ता उसे वापस नेविगेट करता है और कोई विरोधाभासी शीर्षक नहीं होता है।

एक और दृष्टिकोण है कि यूआईनाविगेशन नियंत्रक के प्रतिनिधि का उपयोग करें यह उप-क्लासिंग / यूआईनाविगेशनबार वर्ग को ओवरराइट करने की आवश्यकता नहीं है:

 /* in the place where you init the navigationController: fixer = [[AENavigationControllerDelegate alloc] init]; navigationController.delegate = fixer; */ @interface AENavigationControllerDelegate : NSObject <UINavigationControllerDelegate> @end @implementation AENavigationControllerDelegate #define bgImageTag 143 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { //this is for the future for implementing with the appearance api: if ([[navigationController navigationBar] respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [[navigationController navigationBar] setBackgroundImage:[UIImage imageNamed:@"header-logo-bg.png"] forBarMetrics:UIBarMetricsDefault]; }); } else { UIImageView* imageView = (UIImageView*)[navigationController.navigationBar viewWithTag:bgImageTag]; if(!imageView) { UIImage *image = [UIImage imageNamed:@"header-logo-bg.png"]; imageView = [[[UIImageView alloc] initWithImage:image] autorelease]; imageView.tag = bgImageTag; } [navigationController.navigationBar insertSubview:imageView atIndex:0]; } } @end 

https://gist.github.com/1184147

zPosition , zPosition मान ( UINavigationBar's सबसे गहराई परत की) बदल जाती है। इसलिए यदि आप उस स्थान को zPosition , तो पुराने तरीके से काम करता है।

जैसे।

 UINavigationBar *_bar = navigationController.navigationBar; // Insert ImageView UIImage *_img = [UIImage imageNamed:@"navibar.png"]; UIImageView *_imgv = [[[UIImageView alloc] initWithImage:_img] autorelease]; _imgv.frame = _bar.bounds; UIView *v = [[_bar subviews] objectAtIndex:0]; v.layer.zPosition = -FLT_MAX; _imgv.layer.zPosition = -FLT_MAX+1; [_bar insertSubview:_imgv atIndex:1]; 

यह स्क्रिप्ट दृश्य की परत को संभालता है, इसलिए आपको QuartzCore को आयात करना चाहिए।

यहां एक वैकल्पिक समाधान है जो आपको यूआईनाविगेशनबार के अपने कस्टम उप-वर्ग का उपयोग करने देता है:

https://gist.github.com/1253807

जैसे ही एप्पल ने कहा है, यह श्रेणियों में तरीकों को ओवरराइड करने के लिए सही नहीं है। इसलिए UINavigarionBar की पृष्ठभूमि को अनुकूलित करने का सबसे अच्छा तरीका उप- -(void)drawInRect: और ओवरराइड है -(void)drawInRect: विधि

 @implementation AppNavigationBar - (void)drawRect:(CGRect)rect { UIImage *patternImage = [UIImage imageNamed:@"image_name.png"]; [patternImage drawInRect:rect]; } 

इस अनुकूलित UINavigationBar उपयोग करने के लिए उसे अपने UINavigationBarController संपत्ति के रूप में सेट किया जाना चाहिए। जैसा कि आप जानते हैं कि यह प्रापर्टी केवल पढ़ने योग्य है तो क्या किया जाना चाहिए है:

 - (void)viewDidLoad { [super viewDidLoad]; AppNavigationBar *nav = [AppNavigationBar new]; [self setValue:nav forKey:@"navigationBar"]; } 

यह IOS 5 और 4.3 दोनों के लिए काम करता है

आप UINavigationBar subclass कर सकते हैं और इसे इस तरह सक्षम, drawRect के लिए श्रेणियों अब iOS5 में काम नहीं करेंगे

  navigationController = [[((^ { NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[NSKeyedArchiver archivedDataWithRootObject:navigationController]]; [unarchiver setClass:[SAPHUINavigationBar class] forClassName:@"UINavigationBar"]; [unarchiver setClass:[UIViewController class] forClassName:NSStringFromClass([navigationController.topViewController class])]; return unarchiver; })()) decodeObjectForKey:@"root"] initWithRootViewController:navigationController.topViewController]; 

स्थिर दृश्य (बिल्कुल एनीमेशन नहीं) के लिए, मैं डिफ़ॉल्ट आईओएस सेटबैकगेज छवि का उपयोग करता हूँ

लेकिन जब मेरे पास एक दृश्य होता है जो एनिमेटेड होता है (सबसे अधिक संभावना का आकार बदलता है), मैं एक कस्टम UIImageView बना रहा हूं और इसे नेविगेशनबार में जोड़ देता हूं ताकि मेरे पास इसके अधिक लचीलेपन हो

बात यह है कि अगर आप इसे जोड़ते हैं, तो यह बटन और शीर्षक दृश्य के शीर्ष पर पहुंच जाएगा, इसलिए मैं मैन्युअल रूप से अधिकांश सबव्यूज़ की प्रतिलिपि को सहेजता हूं, उन्हें माता-पिता के दृश्य से निकालना, मेरी छविदृश्य जोड़ें और सभी सबव्यूज़ को वापस जोड़ने से

यह मेरे लिए काम करता है

  UIImageView *navBackground = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navigationBackgroundSample.jpg"]]; UIView *tempTitleView = [[self.navigationBar.subviews objectAtIndex:1] autorelease]; [[self.navigationBar.subviews objectAtIndex:1] removeFromSuperview]; [self.navigationBar addSubview:navBackground]; [self.navigationBar addSubview:tempTitleView]; self.navigationBar.clipsToBounds = YES; [navBackground release]; 

इस स्थिति में, मेरे पास बटन नहीं हैं और मुझे पता चला कि मेरा शीर्षक दृश्य इंडेक्स 1 पर है, यदि आपके पास बटन हैं, तो वे नेविगेशन के सारवृक्ष सरणी में कहीं कहीं होना चाहिए

मुझे पता नहीं है कि सूचकांक 0 में क्या है, मुझे नहीं पता है कि यह आपके पास पाठ शीर्षक के मामले में काम कर सकता है न …