onthewavesのコードスニペット

SwiftやObjective-Cを中心にiPhoneアプリ開発に関するコードスニペットを書きます。

コードスニペット (UITexfField編)

テーマ

UITexfFieldのコードスニペットです。 今回は、UITextFieldDelegateを分離して、UIViewControllerで使いやすくします。

実装手順

  1. UITextFieldDelegateの拡張クラスを作る
  2. 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メソッドを毎回書くのが面倒なのと、毎回ググるのが面倒なので、分離させてみました。 個人的には、可読性も良いと思います。

おすすめ本のご紹介

www.amazon.co.jp

UILabel、UIButtonなどを簡単に角丸、枠線をつける

テーマ

UILabel、UIButtonなどを簡単に角丸、枠線をつける方法をご紹介します。

背景

今まで、ちょっと角丸にしたい、線をつけたいというときに、 毎回ソースコードにcornerRadiusやmasksToBoundsなどに値をセットしていました。

面倒だなーと思っていると、 StoryBoard上で、簡単にできる方法があったので、ご紹介します。 extensionを利用する方法です。

まずは、完成品は、こちら

f:id:onthewaves:20151205122324p:plain

手順

  1. UIViewのextensionを作る
  2. 対象のViewをStoryBoardで設置する
  3. 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を設置します。 設置すると、下記のようなフィールドが追加されます。

f:id:onthewaves:20151205121116p:plain

3. StoryBoardで対象Viewの値を設定する

あとは、下記のプロパティに値を設定すると、完成です。

プロパティ 説明
Corner Radius 角丸の角度
Border Width 枠線の幅
Border Color 枠線の色

f:id:onthewaves:20151205121739p:plain

まとめ

いかがでしたか、プロジェクトに一度今回作成したextensionを追加しておくと、 UIViewを継承したすべてのViewで利用できます。

これでコーディングの効率が上がると思います。 ぜひ、利用してみてください。

やっぱりPCは、大事

2011年から使っていたMac Book Proを卒業し、新しいMac Book Proを購入しました。 快適です。アクセサリー類もポチポチしちゃいました。

www.amazon.co.jp

Amazon.co.jp: MacBook 対応 アートステッカーCARRY 【並行輸入品】: パソコン・周辺機器

コードスニペット(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)

おすすめ本

個人的に良かった本を紹介します。

www.amazon.co.jp

www.amazon.co.jp