为什么在presentmodalviewcontroller调用时,navigationItem.titleView会左对齐?

时间:2010-06-03 17:53:53

标签: ios iphone cocoa-touch uinavigationbar

我正在使用UILabel作为导航栏的titleView(我正在制作简单的应用内网页浏览器)。它工作正常,除了当我呈现模态视图控制器时,titleView从导航栏的中心移动到最左边(在后面按钮下面)。我在3.0及以上测试过。以下是相关代码:

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

知道为什么会这样吗?感谢。

7 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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];
}

答案 2 :(得分:1)

它有动画吗?它可能会为标题视图设置动画,就像它正在转换到新视图一样。我写的代码没有任何问题。

我建议你在displayComposerSheet中,取消设置titleView,或者将titleView的alpha动画设为0.0。然后,当您关闭模态视图控制器时,将其设置为1.0。不理想,但它可能看起来更好。

坦率地说,整个UINavigation系统都是垃圾。由于这些奇怪的问题,我们继续进行重新编写。

答案 3 :(得分: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;
   label.text=@"Stack Overflow";  
   self.navigationItem.titleView = label;

答案 4 :(得分:0)

您可以尝试移动viewDidAppear中的代码:

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

它对我有用。

答案 5 :(得分:0)

如果您将宽度尺寸更改为100磅或更小而不是您设置的120,则此问题可能会消失。设置标签的宽度对我来说更小。

答案 6 :(得分:-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;