我怎样才能得到一个全尺寸的UINavigationBar titleView

问题描述:

我想在UINavigationBar中添加一个自定义控件作为titleView。当我这样做时,尽管设置框架和属性通常会假定为全宽,但我得到: alt text我怎样才能得到一个全尺寸的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

+0

你很幸运,你可以得到的宽度;我有一个非全角标题视图,但它仍然被水平压缩... – 2012-06-19 06:47:32

设置视图的navigationItem的titleView永远不会做伎俩。相反,可以一个子视图添加到导航控制器的的导航栏:

UIView* ctrl = [[UIView alloc] initWithFrame:navController.navigationBar.bounds]; 
ctrl.backgroundColor = [UIColor yellowColor]; 
ctrl.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
[navController.navigationBar addSubview:ctrl]; 
+2

这种方法不适用于导航。在堆栈上推视图控制器使它在这里。我可以在推动和拉动之前将其移除,但这看起来很冒险 – coneybeare 2010-09-23 17:04:09

+0

我最终通过添加动画来添加/删除它在viewwillappear和viewwilldissapear上工作。对于一个怪异的问题,我猜想是一个拙劣的解决方案。我会暂缓给你赏金,看看是否有更好的解决方案出现。 – coneybeare 2010-09-23 17:29:04

+0

这就是我所做的。正如你所说:哈克解决方案! – 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导航按钮也

+0

我猜你在发布之前没有尝试过吗? – VdesmedT 2010-10-04 09:09:33

+2

因为背景清晰,所以这只能看起来适合你。 – 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,享受由上海华调整其新的阻力。

每次设置帧时,都不必设置超级帧。您可以将其设置一次并完成。如果你想支持方位变化,你也可以一起攻击。

+0

这在设置标题视图时帮助我在ios5.0中。非常感谢! :-) – inforeqd 2012-04-20 00:29:30

+0

对于遇到同样问题的任何人...如果您的titleview未显示,您需要覆盖layoutSubviews,并将视图置于前面(或插入更高索引处)。 – mmilo 2012-06-13 06:37:15

+1

+1这只是一个很好的解决方案,而不是所有其他解决布局或类别的解决方案。 – Resh32 2012-12-03 14:19:39

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的大小,而是改变了吧子视图才达到全屏条影响

  1. 做出barView(确保barView宽屏幕大小 - 12 * 2,12 是系统填充设置为titleView,您可以使用手动布局 或自动布局的约束来实现此目的)。然后将其设置为 导航栏的标题查看
  2. 将您的组件添加到此barView中。您可以将组件 从-12对齐到barView的宽度+ 12
  3. 超载您的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 
      } 
     } 
    } 
} 
+0

完美地工作!谢谢 – dreampowder 2018-02-03 22:51:55