2010-06-03 10 views
6

मैं नेविगेशन बार के शीर्षक दृश्य के लिए UILabel का उपयोग कर रहा हूं (मैं सरल इन-ऐप वेब ब्राउज़र बना रहा हूं)। यह ठीक काम करता है, सिवाय इसके कि जब मैं एक मोडल व्यू कंट्रोलर प्रस्तुत करता हूं, शीर्षकव्यू नेविबार के केंद्र से दूर बाईं ओर (पीछे बटन के नीचे) स्थानांतरित होता है। मैंने 3.0 और ऊपर परीक्षण किया है।नेविगेशन Item.titleView क्यों दिखाई देता है जब presentmodalviewcontroller कहा जाता है?

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Title view label 
    CGRect labelFrame = CGRectMake(0.0, 0.0, 120.0, 36.0); 
    UILabel *label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease]; 
    label.font = [UIFont boldSystemFontOfSize:14]; 
    label.numberOfLines = 2; 
    label.backgroundColor = [UIColor clearColor]; 
    label.textAlignment = UITextAlignmentCenter; 
    label.textColor = [UIColor whiteColor]; 
    label.shadowColor = [UIColor blackColor]; 
    label.shadowOffset = CGSizeMake(0.0, -1.0); 
    label.lineBreakMode = UILineBreakModeMiddleTruncation; 
    self.navigationItem.titleView = label; 
} 

-(void)displayComposerSheet:(NSString*)mailto 
{ 
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
    picker.mailComposeDelegate = self; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 

स्क्रीनशॉट:: enter image description here

किसी भी विचार क्यों यह हो रहा है यहाँ प्रासंगिक कोड है? धन्यवाद।

उत्तर

3

सही दिशा में मुझे इंगित करने के लिए डौगडब्ल्यू के लिए धन्यवाद। मुझे मिला सबसे अच्छा हैक यहाँ है। मूल रूप से मैं UILabel को एक वर्ग संपत्ति के रूप में बनाए रखता हूं। मोडल व्यू पेश करने से पहले मैं शीर्षक दृश्य को अनसेट करता हूं, और उसके बाद इसे तुरंत रीसेट करता हूं। जब मोडल व्यू खारिज कर दिया जाता है तो मैं अनसेट करता हूं और फिर शीर्षक दृश्य को रीसेट करता हूं। उपयोगकर्ता के लिए यह स्पष्ट रूप से उल्लेखनीय नहीं है।

-(void)displayComposerSheet:(NSString*)mailto 
{ 
    self.navigationItem.titleView = nil; 
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
    picker.mailComposeDelegate = self; 
    picker.navigationBar.tintColor = [APPDELEGATE getNavTintColor]; 
    [picker setToRecipients:[NSArray arrayWithObject:mailto]]; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
    self.navigationItem.titleView = titlelabel; 
} 

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{ 
    self.navigationItem.titleView = nil; 
    self.navigationItem.titleView = titlelabel; 
    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

इन - (शून्य) लोड व्यू मैंने self.label = [[UILabel alloc] जोड़ा है initWithFrame: self.navigationController.navigationBar.frame]; self.navigationItem.titleView = self.label; और फिर केवल self.label – blyabtroi

1

क्या यह एनिमेट करता है? यह शीर्षक दृश्य को एनिमेट कर सकता है जैसे कि यह एक नए दृश्य में संक्रमण कर रहा है। मुझे लिखित रूप में आपके कोड के साथ कुछ भी गलत नहीं दिख रहा है।

मैं आपके प्रदर्शन में सुझाव दूंगा कॉम्पोजरशीट, आप केवल शीर्षक दृश्य को अनसेट करते हैं, या शीर्षक के अल्फा को 0.0 से एनीमेट करते हैं। फिर, जब आप मोडल व्यू कंट्रोलर को खारिज करते हैं तो इसे 1.0 पर वापस एनिमेट करें। आदर्श नहीं है, लेकिन यह उस तरह से बेहतर लग सकता है।

स्पष्ट रूप से, संपूर्ण यूआईवीविगेशन प्रणाली बकवास है। हम आगे बढ़े और इस तरह के विचित्र मुद्दों के कारण इसे फिर से लिखा।

+0

हां, मोडल व्यू एनिमेटेड है (दूसरा स्क्रीनशॉट प्रगति पर मोडल व्यू की प्रस्तुति दिखाता है)। समस्या यह है कि मॉड्यूल दृश्य को खारिज करने के बाद भी शीर्षकदृश्य बाएं-गठबंधन बना हुआ है। –

+0

सुझाव के लिए धन्यवाद। मैंने कुछ बदलावों की कोशिश की और एक हैक पाया जो समस्या को हल करता है। कोड मेरे जवाब में है। मैं तुम्हें उखाड़ फेंक दूंगा लेकिन मेरे पास पर्याप्त प्रतिष्ठा नहीं है। –

+0

खुशी है कि मैं मदद कर सकता हूं। हाँ, यूनाव सामान एक गंभीर boondoggle है। यह एक शर्म की बात है कि हमें इस तरह हैकी फिक्स का सहारा लेना होगा। – DougW

1

एकमात्र समस्या आपके फ्रेम आकार है। तो आपको इसे बदलना होगा।

इसे आजमाएं।

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 36.0)]; 

    label.font = [UIFont boldSystemFontOfSize:14]; 
    label.numberOfLines = 2; 
    label.backgroundColor = [UIColor clearColor]; 
    label.textAlignment = UITextAlignmentCenter; 
    label.textColor = [UIColor whiteColor]; 
    label.shadowColor = [UIColor blackColor]; 
    label.shadowOffset = CGSizeMake(0.0, -1.0); 
    label.lineBreakMode = UILineBreakModeMiddleTruncation; 
    [email protected]"Stack Overflow"; 
    self.navigationItem.titleView = label; 
+0

हम्म। इसलिए मैंने चौड़ाई को 320 तक बदलने की कोशिश की, लेकिन वही बात होती है। ऐसा लगता है कि UILabel के फ्रेम को नजरअंदाज कर दिया गया है - इसके बजाय यह लेबल के पाठ को स्क्रीन के बाएं किनारे पर संरेखित करता है: -/ –

10

मैं कुछ हिट के साथ समस्या में देखा और कोशिश करते हैं और पाया निम्न तथ्यों:

  • UINavigationBar rightBarButtonItem नहीं है, तो, titleView ~ 30pts द्वारा सही दिशा में बदलाव।
  • इसे बाएंबारबटन इटिम के लिए पुन: उत्पन्न किया जा सकता है। लेकिन मैंने कोशिश नहीं की है।

एक परिदृश्य में जहां एक डिफ़ॉल्ट UINavigationBar (सही बार्बटन Item डिफ़ॉल्ट में कोई परिवर्तन नहीं है) शीर्षक दृश्य सेट है। और उसके बाद एक नया UIView नेविगेशन स्टैक पर धक्का दिया जाता है जो एक सही बार्बटन इटैम है। अब, यदि यह दृश्य पॉप किया गया है [बैक बटन के साथ], नेविगेशन बार दाएं बार्टबटन इटैम को हटा देगा। और यह अजीब ऑफसेट के लिए जिम्मेदार होगा जो शीर्षक को एक तरफ की ओर ले जाता है।

मैं इस समस्या को कैसे ठीक किया गया इस तरह था: अब

self.navigationItem.titleView = myCustomTitleView; 

// Fake right button to align titleView properly. 
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 1)]]; 
// Width equivalent to system default Done button's (which appears on pushed view in my case). 
rightBarButtonItem.enabled = NO; 
self.navigationItem.rightBarButtonItem = rightBarButtonItem; 

सब कुछ मीठा होता है। yummmm।

+0

का पाठ बदल दिया यह मेरे लिए काम किया। धन्यवाद। – mtb

-1
UIView *view= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; 
    [view setUserInteractionEnabled:NO]; 
    view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"logo_small.png"]]; 
    UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithCustomView:view ]; 
    self.navigationItem.leftBarButtonItem = barButton; 
0

आप viewDidAppear में कोड को स्थानांतरित करने की कोशिश कर सकते हैं:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // You code to customize title view 
    self.navigationItem.titleView = logoImage; 
} 

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

संबंधित मुद्दे