如何获得全尺寸UINavigationBar titleView

时间:2010-09-20 23:55:51

标签: iphone uiview uinavigationbar uinavigationitem

我正在尝试在UINavigationBar中添加自定义控件作为titleView。当我这样做,尽管设置框架和通常假设全宽的属性,我得到这个: alt text

明亮的蓝色可以忽略,因为它是我隐藏自定义控件的地方。问题是酒吧两端的窄条导航栏。我如何摆脱这些因此我的自定义视图将延伸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

6 个答案:

答案 0 :(得分:28)

刚遇到同样的问题,经过一番思考解决了它。 titleView的框架每次出现时都会被navigationBar设置。

您所要做的只是UIView的子类并覆盖setFrame

像这样:

    - (void)setFrame:(CGRect)frame {
        [super setFrame:CGRectMake(0.0, 0.0, 320.0, 50.0)];
    }

现在将你的鬼鬼祟祟的新UIView设置为navigationItem.titleView并享受其新发现的阻力来调整超级视图。

每次设置帧时都不必设置超级帧。您可以设置一次并完成。如果你想支持方向改变,你可能也可能一起破解。

答案 1 :(得分:24)

设置视图的titleView的navigationItem永远不会有效。相反,您可以将子视图添加到导航控制器的navigationBar:

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

答案 2 :(得分:2)

以下代码用于 iOS8 / iOS9 / iOS10 / iOS11

swift 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
            }
        }
    }
}

答案 3 :(得分:0)

快速版的ksm回答

def endwords(sent, end='.'):
    words = sent.split()
    return {word for word in words if word.endswith(end)}

答案 4 :(得分:0)

感谢@VdesmedT的答案,我一直在使用这个答案在导航栏中实现全屏大小的titleView。

但是,我最近刚升级到iOS11,我发现这个解决方案不起作用。所以我用另一种方式想出来(可能看起来很奇怪)。这个想法的核心不是更改titleView的大小,而是更改栏的子视图以实现全屏栏的影响

  1. 制作一个barView(确保barView宽度为screenSize - 12 * 2,12 是系统填充设置为titleView,您可以使用手动布局 或自动布局约束以实现此目的)。然后将其设置为 导航栏的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;
    }
    

答案 5 :(得分:-7)

CGRect frame = 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 =@"Available Reports";

self.navigationItem.titleView = titlelabel;

如果你想设置图像然后取uuimage视图而不是uilable你可以创建完整导航栏的任何视图只是告诉我你的导航如何看起来我会发送你的代码,如果你想我可以在导航上放6个按钮还