コードスニペット (UITexfField編)
テーマ
UITexfFieldのコードスニペットです。 今回は、UITextFieldDelegateを分離して、UIViewControllerで使いやすくします。
実装手順
- UITextFieldDelegateの拡張クラスを作る
- UIViewControllerから利用する
1. UITextFieldDelegateの拡張クラスを作る
import UIKit typealias TextFieldShouldReturn = (textField: UITextField) -> Bool typealias TextFieldShouldClear = (textField: UITextField) -> Bool typealias TextFieldShouldBeginEditing = (textField: UITextField) -> Bool typealias TextFieldShouldEndEditing = (textField: UITextField) -> Bool typealias TextFieldDidBeginEditing = (textField: UITextField) -> () typealias TextFieldDidEndEditing = (textField: UITextField) -> () class TextFieldDelegate: NSObject, UITextFieldDelegate { var textFieldShouldReturn: TextFieldShouldReturn? var textFieldShouldClear: TextFieldShouldClear? var textFieldShouldBeginEditing: TextFieldShouldBeginEditing? var textFieldShouldEndEditing: TextFieldShouldEndEditing? var textFieldDidBeginEditing: TextFieldDidBeginEditing? var textFieldDidEndEditing: TextFieldDidEndEditing? func setupTextFieldShouldReturn(textFieldShouldReturn: TextFieldShouldReturn){ self.textFieldShouldReturn = textFieldShouldReturn } func setupTextFieldShouldClear(textFieldShouldClear: TextFieldShouldClear) { self.textFieldShouldClear = textFieldShouldClear } func setupTextFieldShouldBeginEditing(textFieldShouldBeginEditing: TextFieldShouldBeginEditing) { self.textFieldShouldBeginEditing = textFieldShouldBeginEditing } func setupTextFieldShouldEndEditing(textFieldShouldEndEditing: TextFieldShouldEndEditing) { self.textFieldShouldEndEditing = textFieldShouldEndEditing } func setuptextFieldDidBeginEditing(textFieldDidBeginEditing: TextFieldDidBeginEditing) { self.textFieldDidBeginEditing = textFieldDidBeginEditing } //MARK: - UITextFieldDelegate //Returnボタンがタップされた時に呼ばれる func textFieldShouldReturn(textField: UITextField) -> Bool { //キーボードを消す textField.resignFirstResponder() if textFieldShouldReturn != nil{ if let block = textFieldShouldReturn { return block(textField: textField) } } return true } //クリアボタンがタップされた時に呼ばれる func textFieldShouldClear(textField: UITextField) -> Bool { if textFieldShouldClear != nil{ if let block = textFieldShouldClear { return block(textField: textField) } } return true } //テキストフィールドを編集する直前に呼び出される func textFieldShouldBeginEditing(textField: UITextField) -> Bool { if textFieldShouldBeginEditing != nil{ if let block = textFieldShouldBeginEditing { return block(textField: textField) } } return true } //テキストフィールドの編集が終了する直前に呼び出される func textFieldShouldEndEditing(textField: UITextField) -> Bool { if textFieldShouldEndEditing != nil{ if let block = textFieldShouldEndEditing { return block(textField: textField) } } return true } //テキストフィールドを編集する直後に呼び出される func textFieldDidBeginEditing(textField: UITextField) { if textFieldDidBeginEditing != nil{ if let block = textFieldDidBeginEditing { block(textField: textField) } } } //テキストフィールドの編集が終了する直後に呼び出される func textFieldDidEndEditing(textField: UITextField) { if textFieldDidEndEditing != nil{ if let block = textFieldDidEndEditing { block(textField: textField) } } } }
2. UIViewControllerから利用する
下記は、エンターキーを押下されたときのイベント処理です。
import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextField! var delegate: TextFieldDelegate? override func viewDidLoad() { super.viewDidLoad() setup() } func setup() { delegate = TextFieldDelegate() delegate?.setupTextFieldShouldReturn({ (textField) -> Bool in print("\(textField.text)") return true }) textField.delegate = delegate //プレースホルーダーの設定 textField.placeholder = "ここにデータを入力してください" //クリアボタンの表示を指定する(Never/Always/UnlessEditing/WhiteEditing) textField.clearButtonMode = UITextFieldViewMode.WhileEditing //最小フォントサイズ textField.minimumFontSize = 8.0 //表示文字が表示領域を超えた場合の処理を設定する textField.adjustsFontSizeToFitWidth = true } }
まとめ
delegateのメソッドを毎回書くのが面倒なのと、毎回ググるのが面倒なので、分離させてみました。 個人的には、可読性も良いと思います。
おすすめ本のご紹介
UILabel、UIButtonなどを簡単に角丸、枠線をつける
テーマ
UILabel、UIButtonなどを簡単に角丸、枠線をつける方法をご紹介します。
背景
今まで、ちょっと角丸にしたい、線をつけたいというときに、 毎回ソースコードにcornerRadiusやmasksToBoundsなどに値をセットしていました。
面倒だなーと思っていると、 StoryBoard上で、簡単にできる方法があったので、ご紹介します。 extensionを利用する方法です。
まずは、完成品は、こちら
手順
- UIViewのextensionを作る
- 対象のViewをStoryBoardで設置する
- StoryBoardで対象Viewの値を設定する 以上です。
では、やってみます。
1. UIViewのextensionを作る
今回は、角丸と、枠線を引くためのプロパティを追加します。
import UIKit extension UIView { @IBInspectable var cornerRadius: CGFloat { get { return layer.cornerRadius } set { layer.cornerRadius = newValue layer.masksToBounds = newValue > 0 } } @IBInspectable var borderWidth: CGFloat { get { return self.layer.borderWidth } set { self.layer.borderWidth = newValue } } @IBInspectable var borderColor: UIColor? { get { return UIColor(CGColor: self.layer.borderColor!) } set { self.layer.borderColor = newValue?.CGColor } } }
2. 対象のViewをStoryBoardで設置する
今回は、UILabelとUIButtonを設置します。 設置すると、下記のようなフィールドが追加されます。
3. StoryBoardで対象Viewの値を設定する
あとは、下記のプロパティに値を設定すると、完成です。
プロパティ | 説明 |
---|---|
Corner Radius | 角丸の角度 |
Border Width | 枠線の幅 |
Border Color | 枠線の色 |
まとめ
いかがでしたか、プロジェクトに一度今回作成したextensionを追加しておくと、 UIViewを継承したすべてのViewで利用できます。
これでコーディングの効率が上がると思います。 ぜひ、利用してみてください。
やっぱりPCは、大事
2011年から使っていたMac Book Proを卒業し、新しいMac Book Proを購入しました。 快適です。アクセサリー類もポチポチしちゃいました。
コードスニペット(UILabel UIButton編)
毎回、ググるの面倒なので、コードスニペットとして残していこうと思います。
UILabel編
// 文字を設定する label.text = "Hello" // 文字フォントを変更する label.font = UIFont.systemFontOfSize(16) // 文字カラーを変更する label.textColor = UIColor.redColor() // 文字を揃える label.textAlignment = NSTextAlignment.Center label.textAlignment = NSTextAlignment.Left label.textAlignment = NSTextAlignment.Right // 表示最大文字列数を指定する label.numberOfLines = 2 label.numberOfLines = 0 //無限 // 表示領域を超えたときは、フォントサイズを調整する label.adjustsFontSizeToFitWidth = true label.minimumScaleFactor = 0.25 // 0.0 - 1.0まで
UIButton編
//ボタンの状態によって、ボタンの文字列を変える button.setTitle("通常時", forState: .Normal) button.setTitle("ハイライト時", forState: .Highlighted) button.setTitle("無効な時", forState: .Disabled) //ボタンの状態によって、ボタンの文字色を変える button.setTitleColor(UIColor.blackColor(), forState: .Normal) button.setTitleColor(UIColor.redColor(), forState: .Highlighted) button.setTitleColor(UIColor.lightGrayColor(), forState: .Disabled)
おすすめ本
個人的に良かった本を紹介します。