将带有两个 UIBarButtonItem 的 UIToolbar 添加到 UINavigationBar:糟糕的 UIToolbar 以及 iPhone 4 怎么样

Posted

技术标签:

【中文标题】将带有两个 UIBarButtonItem 的 UIToolbar 添加到 UINavigationBar:糟糕的 UIToolbar 以及 iPhone 4 怎么样【英文标题】:Adding UIToolbar with two UIBarButtonItem to a UINavigationBar: poor UIToolbar and what about iPhone 4 【发布时间】:2010-09-24 16:55:04 【问题描述】:

我正在关注here 的第二个提示。在本技巧中,两个 UIBarButtonItem 被放在一个 UIToolbar 中。最后,将 UIToolbar 添加到 UINavigationBar。现在解决我的问题:

1) UIToolbar 顶部有一条白线。如果我增加 UIToolbar 的大小,渐变是错误的。我为 UIToolbar 使用以下尺寸:

    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 90, 44.01)];

我怎样才能摆脱白线?看这里:

问题是有一条白线而不是一条灰线。如果它是灰色的,一切都会完美。

2) iPhone 3 和 iPhone 4 的显示尺寸有什么区别?我是否必须检查使用的是哪款 iPhone,然后将尺寸翻倍?

编辑:

按钮的创建类似于我从上述网站获取的以下示例:

// create a toolbar to have two buttons in the right
UIToolbar* tools = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 133, 44.01)];

// create the array to hold the buttons, which then gets added to the toolbar
NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:3];

// create a standard "add" button
UIBarButtonItem* bi = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:NULL];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];
[bi release];

// create a spacer
bi = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[buttons addObject:bi];
[bi release];

// create a standard "refresh" button
bi = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];
[bi release];

// stick the buttons in the toolbar
[tools setItems:buttons animated:NO];

[buttons release];

// and put the toolbar in the nav bar
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools];
[tools release];

@tc.:

我试图继承UIToolbar

// MyToolbar.h

#import <Foundation/Foundation.h>


@interface MyToolbar : UIToolbar 



@end

// MyToolbar.m

#import "MyToolbar.h"


@implementation MyToolbar

- (void)drawRect:(CGRect)rect 
    // do nothing


- (id)initWithFrame:(CGRect)aRect 
    if ((self = [super initWithFrame:aRect])) 
        self.opaque = NO;
        self.backgroundColor = [UIColor clearColor];
        self.clearsContextBeforeDrawing = YES;      
    
    return self;


@end

【问题讨论】:

【参考方案1】:

不保证 UIToolbar 在 UINavigationBar 内无缝绘制;这可能是您看到的白线的原因。

您也许可以继承 UIToolbar 以便它不绘制(即覆盖 -drawRect: 不做任何事情)。

【讨论】:

我试图继承UIToolbar。现在我的工具栏有黑色背景。我必须实现哪些功能才能从UINavigationBar 获得相同的渐变/样式。 嗯。尝试在initWithFrame:initWithCoder:中酌情额外设置self.opaque = NOself.backgroundColor = [UIColor clearColor]self.clearsContextBeforeDrawing = YES 现在我已经覆盖了initWithFrame:(请参阅我编辑的问题)。乍一看,这似乎有效。我以前从未对 UI 元素进行子类化。我是否必须注意某些事情(不起作用的事情或类似的事情)? 你必须知道 UIToolbar 是如何绘制的。它似乎没有记录在案,所以你几乎必须猜测。它可能会在未来的操作系统版本中发生变化。但是,UIToolbar 文档并没有告诉您不要对其进行子类化,因此您是相当安全的。【参考方案2】:

1) 我无法解释白线。好奇它只在您的按钮上方。按钮是如何创建的?另外,您将高度设置为 44.01,而不仅仅是 44,是否有原因?我不肯定你设置的高度在任何情况下都会得到尊重,他们可能会被强制为 44(如果我错了,请有人纠正我)。

2) 您无需为 iPhone 4 做任何事情,一切都会自动缩放。

【讨论】:

白线仅在我的按钮上方,因为我将按钮放在 UIToolbar 中。然后我把这个 UIToolbar 放在 UINavigationBar 上。所以白线来自我的 UIToolbar 的大小/绘图。是的,44.01 还是 44 确实很重要。44.01 的高度效果很好(这条白线除外)。如果我取 44,那么我会得到更多的绘图工件。我也可以取50的高度。然后白线消失了,但是渐变和导航栏不一样了。有关创建此工件的详细信息,请参阅我编辑的问题。【参考方案3】:

您是否尝试在容器UIView 中添加这些按钮,然后将其添加为项目但使用UIBarButtonSystemItemFlexibleSpace 进行操作?我的意思是将这些按钮中的每一个都添加为一个独立的项目。

【讨论】:

是的,我没有使用UIView,也没有将它们添加为独立项目。相反,我正在创建一个UIToolbar,创建一个按钮数组,将按钮添加到工具栏,最后将工具栏添加到导航栏。有关详细信息,请参阅我编辑的问题。【参考方案4】:

UIToolbar 设计用于 Iphone 屏幕的底部,因此如果您在其他地方使用它会尝试在顶部产生边缘效果。为避免这种情况,工具栏高度应比导航栏高度大 2 个像素。但是这次你会有不同的副作用,它会导致导航栏底部的边缘清晰。 (在任何情况下,导航栏都将 rightbarbuttonitem 定位为居中对齐)

【讨论】:

以上是关于将带有两个 UIBarButtonItem 的 UIToolbar 添加到 UINavigationBar:糟糕的 UIToolbar 以及 iPhone 4 怎么样的主要内容,如果未能解决你的问题,请参考以下文章

如何拆分 UIBarButtonItem?

带有“更多”按钮样式的 UIBarButtonItem

将 UIBarButtonItem 与图像或系统预设一起用于 SplitView/Popover 控件

iOS Swift 导航栏按钮向下移动

带有图像的 UIBarButtonItem 不显示

UIBarButtonItem 中的 UISlider 影响动画行为