我正在尝试在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 :(得分: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的大小,而是更改栏的子视图以实现全屏栏的影响
使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个按钮还