2010-06-03 36 views
6

我使用UILabel作爲導航欄的titleView(我正在製作簡單的應用內網頁瀏覽器)。它工作正常,除了當我呈現一個模式視圖控制器時,titleView從導航欄的中心切換到最左側(在後退按鈕下)。我已經在3.0以上測試過了。下面是相關的代碼:當presentmodalviewcontroller被調用時,爲什麼navigationItem.titleView會左對齊?

- (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

感謝DougW爲我指出正確的方向。這是我發現的最好的黑客。基本上我保留UILabel作爲類屬性。在呈現模態視圖之前,我先取消設置titleView,然後立即重置它。當模式視圖解除時,我取消設置,然後重置titleView。對用戶來說,這些都不明顯。

-(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

In - (void)loadView我已經添加self.label = [[UILabel alloc] initWithFrame:方法self.navigationController.navigationBar.frame]; self.navigationItem.titleView = self.label;然後只改變了自我的文本。標籤 – blyabtroi 2015-12-03 15:28:16

1

它有動畫嗎?它可能會將標題視圖動畫化,就像它正在轉換到新視圖一樣。我沒有看到你的代碼寫錯了。

我會建議在您的displayComposerSheet,你只是取消設置titleView,或動畫alpha的titleView爲0.0。然後,當您關閉模式視圖控制器時,將它重新設置爲1.0。不理想,但它可能看起來更好。

坦率地說,整個UINavigation系統是廢話。由於這些奇怪的問題,我們繼續前進並重新編寫。

+0

是的,模態視圖是動畫的(第二個屏幕截圖顯示了正在進行的模態視圖的呈現)。問題在於,即使模態視圖被解散,titleview仍然保持左對齊。 – 2010-06-03 20:55:41

+0

感謝您的建議。我嘗試了一些變化,發現一個「解決」問題的黑客。代碼在我的答案中。我喜歡你,但我沒有足夠的聲望。 – 2010-06-03 21:31:42

+0

很高興我能幫到你。是的,UINav的東西是一個嚴肅的boondoggle。我們不得不採取這樣的修補措施是一種恥辱。 – DougW 2010-06-03 21:46:19

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的框架 - 相反,它將標籤中的文本與屏幕的左邊緣對齊: -/ – 2010-06-03 20:51:45

10

我看着一些命中問題和嘗試,並發現了以下事實:

  • 如果UINavigationBar的沒有rightBarButtonItem,於titleview朝着由〜30pts右移。
  • 它可以爲leftBarButtonItem重現。但我沒有嘗試過。

在默認的UINavigationBar(沒有更改rightBarButtonItem默認值)titleView的場景中設置。然後一個新的UIView被推送到導航堆棧,該堆棧有一個rightBarButtonItem。現在,如果此視圖彈出[帶後退按鈕],導航欄將刪除rightBarButtonItem。這將解釋奇怪的偏移量,將titleView轉移到一側。

我如何修正這個問題是這樣的:

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 2012-11-08 18:21:52

-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; 
} 

這對我的作品。

相關問題