2010-09-20 37 views
18

我想在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

回答

23

設置視圖的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

-7

的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

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

0

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 
       ) 
     } 
} 
0

感謝@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; 
    } 
    
1

措辭上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