UIBarButtonItemで隠されたボタンを使用する

Sunday, February 14, 2016

image

UIBarButtonItemには、typeを指定して、標準で用意されている様々なアイコンを使用できます。
(ここに一覧が掲載されています。)
しかし、 < > ∧ ∨や、ゴミ箱アイコンといったものが用意されていません。
これを毎回画像で用意するのはしんどいし、"< >"と文字で生成するとなんかダサいし。。
ただ、標準アプリであるSafariとか、UINavigationBarの戻るボタン等、標準で< >を使っているのでなんとかして使えるなら使いたい。
それを解決してみます。

enum UIBarButtonHiddenItem: Int {
    case Previous = 101
    case Next     = 102
    case Up       = 103
    case Down     = 104
    case Locate   = 100
    case Trash    = 110
    func convert() -> UIBarButtonSystemItem {
        return UIBarButtonSystemItem(rawValue: self.rawValue)!
    }
}

extension UIBarButtonItem {
    convenience init(barButtonHiddenItem item:UIBarButtonHiddenItem, target: AnyObject?, action: Selector) {
        self.init(barButtonSystemItem: item.convert(), target:target, action: action)
    }
}

このようにして、UIBarButtonHiddenItemを定義して、UIBarButtonSystemItemとのブリッジを作成します。
使い方はこんな感じです。オリジナルの場合も記述しておきます。

UIBarButtonItem(barButtonHiddenItem: .Previous, target: target, action: action) // "<" が使える!
// 通常の場合
UIBarButtonItem(barButtonSystemItem: .Add, target: target, action: action)

UIBarButtonSystemItem(rawValue: )に渡す値によって、通常は指定できないタイプのアイコンを指定でき、表示することができます。

  • 101 : <
  • 102 : >
  • 103 : ∧
  • 104 : ∨
  • 100 : 位置情報のアイコン
  • 110 : ゴミ箱アイコン

他にも、数値を入れると、元々UIBarButtonSystemItemで指定できるアイコンが出現したりします。

パパっと試したい人は、以下をPlaygroundに貼り付けて実行して、viewを表示するとアイコンをみることができます。

import UIKit

enum UIBarButtonHiddenItem: Int {
    case Previous = 101
    case Next     = 102
    case Up       = 103
    case Down     = 104
    case Locate   = 100
    case Trash    = 110
    func convert() -> UIBarButtonSystemItem {
        return UIBarButtonSystemItem(rawValue: self.rawValue)!
    }
}

extension UIBarButtonItem {
    convenience init(barButtonHiddenItem item:UIBarButtonHiddenItem, target: AnyObject?, action: Selector) {
        self.init(barButtonSystemItem: item.convert(), target:target, action: action)
    }
}

let toolBar = UIToolbar()
let t0 = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: "")
let t1 = UIBarButtonItem(barButtonHiddenItem: .Previous, target: nil, action: "")
let t2 = UIBarButtonItem(barButtonHiddenItem: .Next, target: nil, action: "")
let t3 = UIBarButtonItem(barButtonHiddenItem: .Up, target: nil, action: "")
let t4 = UIBarButtonItem(barButtonHiddenItem: .Down, target: nil, action: "")
let t5 = UIBarButtonItem(barButtonHiddenItem: .Locate, target: nil, action: "")
let t6 = UIBarButtonItem(barButtonHiddenItem: .Trash, target: nil, action: "")

toolBar.sizeToFit()
toolBar.setItems([t0, t1, t2, t3, t4, t5, t6], animated: false)
toolBar.backgroundColor = UIColor.lightGrayColor()

let view = UIView(frame: CGRectMake(0,0,400,100))
view.addSubview(toolBar)
view.backgroundColor = .whiteColor()

参考

techSwiftTips

EnhancedAutoreleasePoolを作成しました。

休日