代码之家  ›  专栏  ›  技术社区  ›  coneybeare

我怎样才能买到一个全尺寸的UinavigationBar标题视图

  •  19
  • coneybeare  · 技术社区  · 14 年前

    我正在尝试将自定义控件添加为uinavigationbar中的标题视图。当我这样做时,尽管设置了框架和通常假定为全宽的属性,我还是得到了:

    亮蓝色可以忽略,因为它是我隐藏自定义控件的地方。问题是导航条末端的窄条。我如何才能摆脱这些,这样我的自定义视图将延伸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=控制;
    < /代码> 
    
    

    PS-我知道我可以自己添加视图,而不是连接到导航栏,这将是非常容易的定位它自己。我有理由需要它“打开”导航栏,这些原因是here.

    亮蓝色可以忽略,因为它是我隐藏自定义控件的地方。问题是导航条末端的窄条。我如何才能摆脱这些,这样我的自定义视图将延伸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 回复  |  直到 7 年前
        1
  •  24
  •   Ozgur Vatansever    8 年前

    设置视图的导航项的标题视图永远不会起作用。相反,您可以将子视图添加到导航控制器的导航栏:

    UIView* ctrl = [[UIView alloc] initWithFrame:navController.navigationBar.bounds];
    ctrl.backgroundColor = [UIColor yellowColor];
    ctrl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    [navController.navigationBar addSubview:ctrl];
    
        2
  •  27
  •   ksm    13 年前

    只是遇到了同样的问题,经过一番思考,解决了它。导航栏每次出现时都会设置标题视图的帧。

    您所要做的就是子类uiview和override setFrame .

    这样地:

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

    现在,将您的新uiview设置为 navigationItem.titleView 享受它新发现的对SuperView调整大小的抵抗。

    你不必每次定格时都设置super的帧。你只需设置一次就可以完成。如果你想支持方向改变,你也可以把它拼凑起来。

        3
  •  2
  •   xu tong    7 年前

    下面的代码是在 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
                }
            }
        }
    }
    
        4
  •  0
  •   Marlo Quidato    7 年前

    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
                    )
           }
    }
    
        5
  •  0
  •   amagain    7 年前

    谢谢 @VdesmedT 对于答案,我一直使用这个答案来实现导航栏中的全屏标题视图。

    但是,我最近刚升级到ios11,我发现这个解决方案不起作用。所以我用另一种方法来解决(可能看起来很奇怪)。这个想法的核心不是改变标题视图的大小,而是改变工具栏的子视图以实现全屏栏的效果。

    1. 制作条形图(确保条形图宽度为屏幕尺寸-12*2,12 系统填充是否设置为“标题视图”,可以使用手动布局 或者自动布局的约束来实现这一点)。然后设置为 导航栏标题视图
    2. 将组件添加到此条形图中。可以对齐组件 从-12到Barview的宽度+12
    3. 使您的barview的点过载,使它甚至可以响应 当点击发生在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;
      }
      
        6
  •  -7
  •   GhostRider    14 年前

    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 =@"Available Reports";
    
    self.navigationItem.titleView = titlelabel;
    

    如果你想设置图像,那就用uiimage视图代替ui标签,你可以创建完全导航栏的任何视图,只要告诉我你的导航是什么样子的,我会给你发送代码,如果你想的话,我也可以在导航上放6个按钮。