[英]How to add a searchBar with scopebar inside of a NavigationBar where the navBar automatically increase its height and shows the scopeBar
[英]Increase NavigationBar height
我有以下代碼:
func navbarbutton() {
UIView.animateWithDuration(0.2, animations: { () -> Void in
let current = self.navigationController?.navigationBar.frame
self.navigationController?.navigationBar.frame = CGRectMake(self.frame!.origin.x, self.frame!.origin.y, self.frame!.size.width, current!.size.height + 50)
self.navigationController?.navigationBar.layoutIfNeeded()
})
}
我能夠將導航欄的高度增加50 dp。 這對我來說不是問題。 我遇到的問題是UIBarButtonItems
都與底部對齊。 如何讓它們與頂部對齊,以便我可以自己添加更多底部? 我按照圖像得到了一些東西:
有可能讓它與頂部對齊嗎?
不幸的是你做不到。
UINavigationBar
的視圖層次結構是私有的,因此您無法在不迭代子視圖的情況下對其進行操作。 這可能不是一個好主意。
出於好奇,我使用視圖調試器查看了iOS 10中的Messages應用程序,因為它們顯然是這樣做的。 他們實際上通過添加自己的UIButton
來替換back和rightBarButtonItem來實現布局。 這是您可以執行的操作,但是他們還將其中一個內部(和私有)內容視圖的alpha設置為零,以便原始內容不再可見。
不幸的是,這是你無法輕易做到的事情。 你可以嘗試破解它直到它工作,但記住你還需要處理推/彈,在調用狀態欄,交互式轉換和旋轉事件。
然而,如果你不打算對iMessage的風格,只是想增加你的導航欄下面一些內容,為什么不看釘扎UIVisualEffectView
到topLayoutGuide
在你UIViewController
? 你可以很容易地獲得一個相當不錯的外觀,它可以節省很多黑客的東西。 這是一個例子:
試試這段代碼:
注意:代碼在Swift 3中測試過。
答案1: 更新了答案
class ViewController: UIViewController {
var customBar: UINavigationBar = UINavigationBar()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//Title
title = "Some Title"
// Add bar button item
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(addTapped))
self.customBar.frame = CGRect(x:0, y:0, width:view.frame.width, height:(navigationController?.navigationBar.frame.height)! + 50)
self.customBar.backgroundColor = UIColor.green
self.view.addSubview(customBar)
}
func addTapped() {
print("Button Pressed")
}
輸出:
答案2:
override var isViewLoaded: Bool {
// Add bar button item
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Add", style: .plain, target: self, action: #selector(addTapped))
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(addTapped))
//Vertical and Horizonal barButtonItem position offset
navigationItem.leftBarButtonItem?.setTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: 20), for: UIBarMetrics.default)
navigationItem.rightBarButtonItem?.setTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: 20), for: UIBarMetrics.default)
return true
}
func addTapped() {
print("Button Pressed")
}
注意:上面的代碼只適用於isViewLoaded:Bool方法。但是,沒有運氣。當我在其他viewLoad方法中嘗試此代碼時。
輸出1: barButtonItem垂直向上移動20像素。
輸出2: barButtonItem垂直向下移動20個像素。
希望,上面的代碼修復你的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.