将带有两个 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 = NO
、self.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 怎么样的主要内容,如果未能解决你的问题,请参考以下文章