03-導(dǎo)航欄設(shè)置

導(dǎo)航欄設(shè)置

課程目標(biāo)

  • 便利構(gòu)造函數(shù)的使用
  • 自定義顯示到 XIB 控制面板的屬性
  • 自定義導(dǎo)航控制器思路

發(fā)現(xiàn)頁面搜索框

課程目標(biāo)

  • 明確 Xib 創(chuàng)建視圖的流程
  • IBInspectable&IBDesignable使用

代碼實現(xiàn)

  • 新建 HMDiscoverSearchView 繼承于 UIView
class HMDiscoverSearchView: UIView,UITextFieldDelegate {

}
  • 新建 Xib 文件 HMDiscoverSearchView.xib
  1. 拖入 UITextField 作輸入框
  • 拖入 UIButton 作取消按鈕
  • 添加相關(guān)約束
  • 指定 class 為 HMDiscoverSearchView
  • 連線
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var cancelButton: UIButton!
  • HMDiscoverSearchView 提供類方法通過 xib 創(chuàng)建 view
class func searchView() -> HMDiscoverSearchView {
    let view = NSBundle.mainBundle().loadNibNamed("HMDiscoverSearchView", owner: nil, options: nil).last! as! HMDiscoverSearchView
    return view;
}
  • HMDiscoverTableViewController 添加方法,測試此View的顯示
private func setupUI(){
    let searchView = HMDiscoverSearchView.searchView()
    searchView.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, 35)
    navigationItem.titleView = searchView
}
  • 設(shè)置 textfield 的左邊放大鏡視圖
private lazy var leftImage: UIImageView = {
    return UIImageView(image: UIImage(named: "searchbar_textfield_search_icon")!)
}()

...
override func awakeFromNib() {
    // 設(shè)置 textField 的左邊視圖
    leftImage.frame = CGRectMake(0, 0, frame.height, frame.height)
    leftImage.contentMode = .Center
    textField.leftView = leftImage
    // 設(shè)置顯示模型
    textField.leftViewMode = UITextFieldViewMode.Always
}
  • 設(shè)置 textField 的代理掰担,實現(xiàn)代理方法
class HMDiscoverSearchView: UIView,UITextFieldDelegate {
    ...

    func textFieldDidBeginEditing(textField: UITextField) {

    }
}

  • 拖入 textfield 右邊的約束到 view 中,在開始編輯的時候執(zhí)行動畫
@IBOutlet weak var textFieldRightCons: NSLayoutConstraint!
  • 執(zhí)行約束動畫需要調(diào)用 view 的 layoutIfNeed
func textFieldDidBeginEditing(textField: UITextField) {
    textFieldRightCons.constant = cancelButton.frame.width
    // 執(zhí)行動畫
    UIView.animateWithDuration(0.25) { () -> Void in
        self.textField.layoutIfNeeded()
    }
}
  • 拖入取消按鈕的點擊事件,點擊的時候取消第一響應(yīng)者并執(zhí)行動畫
@IBAction func cancelButtonClick(sender: UIButton) {
    textField.resignFirstResponder()
    textFieldRightCons.constant = 0

    // 執(zhí)行動畫
    UIView.animateWithDuration(0.25) { () -> Void in
        self.textField.layoutIfNeeded()
    }
}

IBInspectable & IBDesignable

IBInspectable

  • 其修飾的屬性可以在 XIB/SB 右邊控制面板顯示
  • 可以重寫該屬性的 get/set 方法做自己的操作

IBDesignable

  • 其修飾自定義 View
  • 可以在更改 IBInspectable 修飾的屬性的時候動態(tài)在 XIB/SB 里面渲染

圖片填充模式

圖片填充模式.png

UIBarButtonItem抽取

  • 快速構(gòu)造一個 UIBarButtonItem
// item 上的文字顏色,高亮顏色带迟,字體大小
// 導(dǎo)航欄上左右的文字一般都會統(tǒng)一演熟,所以可以定義成常量
private let ItemNormalColor = UIColor(red: 80/255, green: 80/255, blue: 80/255, alpha: 1)
private let ItemHighlightedColor = UIColor.orangeColor()
private let ItemFontSize: CGFloat = 14

extension UIBarButtonItem {

    /// 快速構(gòu)造一個 UIBarButtonItem
    ///
    /// - parameter imgName: 圖片名字
    /// - parameter title:   標(biāo)題文字
    /// - parameter target:
    /// - parameter action:
    ///
    /// - returns: UIBarButtonItem
    convenience init(imgName: String? = nil,title: String? = nil, target: AnyObject?, action: Selector){
        self.init()

        let button = UIButton()
        button.addTarget(target, action: action, forControlEvents: .TouchUpInside)

        // 如果有圖片,設(shè)置圖片
        if let img = imgName {
            button.setImage(UIImage(named: img), forState: UIControlState.Normal)
            button.setImage(UIImage(named: "\(img)_highlighted"), forState: UIControlState.Highlighted)
        }

        // 如果有文字项郊,設(shè)置文字
        if let t = title {
            button.setTitle(t, forState: UIControlState.Normal)
            button.titleLabel?.font = UIFont.systemFontOfSize(ItemFontSize)
            button.setTitleColor(UIColor(red: 80/255, green: 80/255, blue: 80/255, alpha: 1), forState: .Normal)
            button.setTitleColor(UIColor.orangeColor(), forState: .Highlighted)
        }
        button.sizeToFit()

        customView = button

    }
}

自定義導(dǎo)航控制器

課程目標(biāo)

自定義 UINavigationController,實現(xiàn)新浪微博左上角返回按鈕邏輯

  • 如果是從一級頁面進入到二級頁面斟赚,第二級頁面左上角返回按鈕顯示一級頁面的title
  • 如果是從二級頁面進入到三級頁面(或者層次更深)着降,進入頁面的左上角返回按鈕顯示返回

分析

  • 如果要在每一個控制器里面分別設(shè)置的話,代碼煩瑣而且擴展性不強拗军,所以寫一個自己的 UINavigationController
  • 新push進入的控制器都會經(jīng)過 UINavigationControllerpushViewController(viewController: UIViewController, animated: Bool) 方法
  • 可以在這個方法里面判斷當(dāng)前是 push 進入的是第幾級控制器任洞,并設(shè)置不同的返回按鈕title

代碼

import UIKit

class HMNavigationController: UINavigationController {

    /**
    重寫此方法,在里面統(tǒng)一返回按鈕邏輯

    - parameter viewController: 將要push進來的控制器
    - parameter animated:       是否需要動畫
    */
    override func pushViewController(viewController: UIViewController, animated: Bool) {

        // 如果當(dāng)前里面有控制器发侵,才執(zhí)行下面的邏輯
        if childViewControllers.count > 0 {

            var title = "返回"

            if childViewControllers.count == 1 {
                //正要往里面添加第二個控制器
                title = childViewControllers.first?.title ?? "返回"
            }
            // push第二個或者以后控制器隱藏底部tabBar
            viewController.hidesBottomBarWhenPushed = true
            // 設(shè)置左邊item
            viewController.navigationItem.leftBarButtonItem = UIBarButtonItem(imgName: "navigationbar_back_withtext", title: title, target: self, action: "back")

        }
        super.pushViewController(viewController, animated: animated)
    }

    @objc private func back(){
        popViewControllerAnimated(true)
    }
}

在 HMMainViewController 添加子控制器的地方交掏,使用自己定義的導(dǎo)航控制器

  • 默認push控制器的時候,頂部右邊會出現(xiàn)部分陰影:
navigationBar-bug.png

解決方法:

// 給tabBar(或者navigationBar)設(shè)置一張背景圖片
// HMMainViewController->ViewDidLoad()方法里面
let tab = HMTabBar()
// 設(shè)置撰寫按鈕點擊的事件響應(yīng)
tab.composeButtonClickBlock = {
    print("撰寫按鈕點擊")
}
// 設(shè)置背景圖片器紧,去掉頂部陰影的效果
tab.backgroundImage = UIImage(named: "tabbar_background")
setValue(tab, forKey: "tabBar")

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耀销,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熊尉,老刑警劉巖罐柳,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狰住,居然都是意外死亡张吉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門催植,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肮蛹,“玉大人,你說我怎么就攤上這事创南÷字遥” “怎么了稿辙?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵昆码,是天一觀的道長。 經(jīng)常有香客問我邻储,道長赋咽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任吨娜,我火速辦了婚禮脓匿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宦赠。我一直安慰自己陪毡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布袱瓮。 她就那樣靜靜地躺著缤骨,像睡著了一般爱咬。 火紅的嫁衣襯著肌膚如雪尺借。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天精拟,我揣著相機與錄音燎斩,去河邊找鬼。 笑死蜂绎,一個胖子當(dāng)著我的面吹牛栅表,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播师枣,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼怪瓶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了践美?” 一聲冷哼從身側(cè)響起洗贰,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤找岖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后敛滋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體许布,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年绎晃,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜜唾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡庶艾,死狀恐怖袁余,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咱揍,我是刑警寧澤泌霍,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站述召,受9級特大地震影響朱转,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜积暖,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一藤为、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夺刑,春花似錦缅疟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沼填,卻和暖如春桅咆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坞笙。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工岩饼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薛夜。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓籍茧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梯澜。 傳聞我的和親對象是個殘疾皇子寞冯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容