我怎样才能得到一个全尺寸的UINavigationBar titleView
我想在UINavigationBar中添加一个自定义控件作为titleView。当我这样做时,尽管设置框架和属性通常会假定为全宽,但我得到: 我怎样才能得到一个全尺寸的UINavigationBar titleView
明亮的蓝色可以忽略,因为它是隐藏我的自定义控件的位置。问题是酒吧两端的窄条导航栏。我如何摆脱这些因此我的自定义视图将伸展100%?
CGRect frame = CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.width, kDefaultBarHeight);
UANavBarControlView *control = [[[UANavBarControlView alloc] initWithFrame:frame] autorelease];
control.autoresizingMask = UIViewAutoresizingFlexibleWidth;
self.navigationItem.titleView = control;
PS - 我知道我可以自己添加视图,而不是附加到导航栏上,它可以很容易地自己定位。我有我的理由,需要它在导航栏上“,”原因是这些原因是here
设置视图的navigationItem的titleView永远不会做伎俩。相反,可以一个子视图添加到导航控制器的的导航栏:
UIView* ctrl = [[UIView alloc] initWithFrame:navController.navigationBar.bounds];
ctrl.backgroundColor = [UIColor yellowColor];
ctrl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[navController.navigationBar addSubview:ctrl];
这种方法不适用于导航。在堆栈上推视图控制器使它在这里。我可以在推动和拉动之前将其移除,但这看起来很冒险 – coneybeare 2010-09-23 17:04:09
我最终通过添加动画来添加/删除它在viewwillappear和viewwilldissapear上工作。对于一个怪异的问题,我猜想是一个拙劣的解决方案。我会暂缓给你赏金,看看是否有更好的解决方案出现。 – coneybeare 2010-09-23 17:29:04
这就是我所做的。正如你所说:哈克解决方案! – VdesmedT 2010-09-23 21:08:40
的CGRect帧= CGRectMake(0,0,320,44);
UILabel *titlelabel = [[UILabel alloc]initWithFrame:frame];
titlelabel.textAlignment = UITextAlignmentCenter;
titlelabel.backgroundColor = [UIColor clearColor];
titlelabel.textColor = [UIColor whiteColor];
titlelabel.font = [UIFont systemFontOfSize:20];
titlelabel.text [email protected]"Available Reports";
self.navigationItem.titleView = titlelabel;
,如果你想设置的图像,然后在uilable可以创建充分导航栏只是告诉我任何视图下的UIImage视图,而不是如何,如果你想我可以把UR导航的样子我会送你的代码为6导航按钮也
我猜你在发布之前没有尝试过吗? – VdesmedT 2010-10-04 09:09:33
因为背景清晰,所以这只能看起来适合你。 – coneybeare 2010-10-04 13:31:27
刚刚遇到了同样的问题,经过一些思考解决了它。 titleView的框架在每次出现时都由导航条设置。
所有你需要做的是子类UIView并覆盖setFrame
。
像这样:
- (void)setFrame:(CGRect)frame {
[super setFrame:CGRectMake(0.0, 0.0, 320.0, 50.0)];
}
现在你们偷偷摸摸新的UIView作为navigationItem.titleView
,享受由上海华调整其新的阻力。
每次设置帧时,都不必设置超级帧。您可以将其设置一次并完成。如果你想支持方位变化,你也可以一起攻击。
KSM的回答斯威夫特版本
let leftOffset: CGFloat = 60
let rightOffset: CGFloat = 60
@objc override var frame: CGRect {
didSet {
let width: CGFloat = UIScreen.main.bounds.width - leftOffset - rightOffset
let height: CGFloat = 44
super.frame = CGRect(
x: leftOffset,
y: 20,
width: width,
height: height
)
}
}
感谢@VdesmedT
的答案,我一直用这个答案来实现导航栏的全屏幕大小titleview的。
但是,我刚刚升级到iOS11,我发现这个解决方案没有工作。所以我通过另一种方式找出了它(可能看起来很奇怪)。该理念的核心是不改变titleview的大小,而是改变了吧子视图才达到全屏条影响
- 做出barView(确保barView宽屏幕大小 - 12 * 2,12 是系统填充设置为titleView,您可以使用手动布局 或自动布局的约束来实现此目的)。然后将其设置为 导航栏的标题查看
- 将您的组件添加到此barView中。您可以将组件 从-12对齐到barView的宽度+ 12
-
超载您的barView的pointInside,使其响应甚至 ,当点击发生在barView外部时。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { BOOL ret = [super pointInside:point withEvent:event]; if (ret == NO) { CGRect expandRect = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(0, -12, 0, -12)); ret = CGRectContainsPoint(expandRect, point); } return ret; }
措辞上iOS8上/ iOS9/iOS10/iOS11下面的代码。
守则迅速3
class TitleView: UIView {
override var frame: CGRect {
get {
return super.frame
}
set {
super.frame = newValue.insetBy(dx: -newValue.minX, dy: 0)
}
}
override func didMoveToSuperview() {
if let superview = superview {
frame = superview.bounds
translatesAutoresizingMaskIntoConstraints = true
autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
}
override func updateConstraints() {
super.updateConstraints()
/// remove autolayout warning in iOS11
superview?.constraints.forEach { constraint in
if fabs(constraint.constant) == 8 {
constraint.isActive = false
}
}
}
}
完美地工作!谢谢 – dreampowder 2018-02-03 22:51:55
你很幸运,你可以得到的宽度;我有一个非全角标题视图,但它仍然被水平压缩... – 2012-06-19 06:47:32