水平居中 UIToolbar 中的所有项目,包括使用 UILabel 的自定义视图

Posted

技术标签:

【中文标题】水平居中 UIToolbar 中的所有项目,包括使用 UILabel 的自定义视图【英文标题】:Horizontally centering all items in UIToolbar, including custom view with UILabel 【发布时间】:2013-12-19 04:47:24 【问题描述】:

我有一个带有工具栏和两个按钮的 UIPopoverController。在这些系统按钮之间是一个带有标签的自定义视图。我注意到系统按钮看起来比工具栏的中间线略高。

如果您查看屏幕截图,Cancel+ 系统按钮看起来比标签更高——即使标签水平居中。这是 ios 7 中的默认外观,因此是“正常”的吗?或者我可以用下面的代码做一些调整来对齐标签吗?也许在它的视野内稍微向上移动它?

我知道这是一件小事,但我觉得这很奇怪。

我尝试过更改自定义视图的框架,但是当它添加到工具栏时,它似乎会调整它,但它认为合适。我是否应该在工具栏上方添加包含标签的视图,而不是作为包含标签的按钮?

首先我创建弹出框控制器:

- (void)viewDidLoad

    [super viewDidLoad];

    UIViewController *viewController = [[UIViewController alloc] init];
    viewController.view.frame = CGRectMake(0, 0, 200, 200);

    self.popoverController = [[UIPopoverController alloc] initWithContentViewController:viewController];
    UIToolbar *viewToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 200, 39)];
    viewToolbar.backgroundColor = [UIColor grayColor];
    viewToolbar.barStyle = UIBarStyleDefault;

    [self.popoverController.contentViewController.view addSubview:viewToolbar];
    self.popoverController.popoverContentSize = CGSizeMake(200, 200 + 39);

    _toolbar = viewToolbar;

然后当点击按钮时:

- (IBAction)buttonTapped:(id)sender 
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelAction:)];
    UIBarButtonItem *separator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
    label.font = [UIFont systemFontOfSize:17];
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor blackColor];
    label.text = @"The Title";
    label.textAlignment = NSTextAlignmentCenter;
    [label sizeToFit];

    UIBarButtonItem *title = [[UIBarButtonItem alloc] initWithCustomView:label];
    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction:)];

    _toolbar.items = @[ cancelButton, separator, title, separator, addButton ];

    [self.popoverController presentPopoverFromRect:self.button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];

【问题讨论】:

【参考方案1】:

一种解决方案是将您的 UILabel *label 放在“容器”UIView 中,*label 标签的 y 原点可能为 -2px。然后将“容器”UIView 设置为 UIBarButtonItem 的视图

UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.font = [UIFont systemFontOfSize:17];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor blackColor];
label.text = @"The Title";
label.textAlignment = NSTextAlignmentCenter;
[label sizeToFit];

UIView *labelContainerView = [[UIView alloc]initWithFrame:label.frame];

//adjust the origin
CGRect labelFrame = label.frame;
labelFrame.origin.y = -2;
label.frame = labelFrame;

[labelContainerView addSubView:label];
UIBarButtonItem *title = [[UIBarButtonItem alloc] initWithCustomView:labelContainerView];

【讨论】:

效果很好。也许我太挑剔了,但默认情况下它看起来很奇怪。

以上是关于水平居中 UIToolbar 中的所有项目,包括使用 UILabel 的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

excel中怎样使表格数据显示为水平居中和垂直居中?

怎样使网页设计中的css盒子内容居中?

在 UIToolBar 上居中按钮

如何使两个按钮彼此相邻,同时使它们保持水平居中于网页?

使 flexbox 中的项目占据所有垂直和水平空间

表格怎么让文字居中?