20200331のSwiftに関する記事は4件です。

Swift4以降のKVOについて

はじめに

KVOとはKey-Value Observingの略で、対象のObjectの値を監視し、変更のタイミングで通知を行ってくれるものです。
とても簡単に特定の値の監視を行うことができますので、今回はその使い方についてまとめてみました。

KVOの使い方

監視の登録方法について

Objectの値の監視を登録するにはobserve(_:options:changeHandler:)を使用します。
各引数の説明を簡単に行います。

func observe<Value>(_ keyPath: KeyPath<T, Value>, options: NSKeyValueObservingOptions = [], changeHandler: @escaping (T, NSKeyValueObservedChange<Value>) -> Void) -> NSKeyValueObservation
  • keyPath : KeyPath形式で監視したいObjectの値を指定
  • options : 変更前後、どの値を通知してもらうか指定するオプション
  • changeHandler : Value変更時に呼ばれるHandler
    • T : 対象のObject
    • NSKeyValueObservedChange<Value> : 監視対象の値の変更時の値を格納

実例

では実例を見ていきましょう、使い方は簡単です。
下の例ではviewframeの変更時に通知をするよう処理を記述しています。

/// インスタンスを保持
var observations = [NSKeyValueObservation]()

/// Objectの値の監視を追加
func addKeyValueObserver() {
    let observation = view.observe(\.frame, options: [.new, .old], changeHandler: { object, change in
        // value変更時の処理を記載
        print("変更前の値: \(change.newValue), 変更後の値: \(change.oldValue)")
    })
    observations.append(observation)
}

/// 監視を停止し、インスタンスを削除
func removeKeyValueObserver() {
    // 監視を停止
    observations.forEach({ $0.invalidate() })
    observations.removeAll()
}

optionsで設定している値はnewで変更後の値を通知するよう指定、oldで変更前の値を通知するよう指定できます。
ちなみに変更が通知された際に、変更された値の中身を確認する必要がない場合はoptions:は省略することができます。
その場合は、newValueおよびoldValuenilになります。

KVOの使い所

プロパティを外から監視できる

既存のframeworkのプロパティなど、変化を検知したいが検知するためのdelegateが存在しない場合などは、KVOを使用して該当のプロパティ対して外から監視を行い、プロパティの変更を検知をすることができます。

おわりに

KVOを使用することで簡単にプロパティの監視を行うことが出来ますので、是非使い所を見つけて使ってみてください。

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

swiftで角丸のボタンを実装する方法

はじめに

今回も備忘録として残します。

コード実装

test.swift
import UIKit

@IBDesignable class RoundedCornersButton: UIButton {

    // 角丸の半径(0で四角形)
    @IBInspectable var cornerRadius: CGFloat = 0.0

    // 枠
    @IBInspectable var borderColor: UIColor = UIColor.clear
    @IBInspectable var borderWidth: CGFloat = 0.0

    override func draw(_ rect: CGRect) {
        // 角丸
        self.layer.cornerRadius = cornerRadius
        self.clipsToBounds = (cornerRadius > 0)

        // 枠線
        self.layer.borderColor = borderColor.cgColor
        self.layer.borderWidth = borderWidth

        super.draw(rect)
    }
}

実装レイアウトに反映する方法

「show the identity inspector」の「custom class」に先ほど作ったClass名を入れる

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Xcode StoryBoard]よく使うけど忘れてしまう設定項目

NSTabelViewの模様を縞模様にする

TableViewのAttributeInspectorより、Alternating Rowsのチェックボックスをオンにする。

NSTableViewの行幅を変える

TableViewのSizeInspectorより、RowHeightの値を設定する。Explicitのチェックを入れてから外すと自動でセルの高さと揃えてくれる。
しかし、セルの高さを広げてしまうとTableの高さまで変わってしまうので、もとに戻したい場合は上記の方法でもとに戻す。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ボタンのレイアウトがうまく決まらなくてこまった

普段はStoryboardを使わずにコードでレイアウトを組むことが多いけど
Storyboardを使ってレイアウトを組んでみたら基本的なこともわからずかなり時間がかかったのでメモ

カスタムクラスをStoryboardで使う場合

コードで生成したカスタムクラスをStoryboardで使う場合Identity InspectorのClassに使用するカスタムクラスのクラス名を入力してstoryboardとコード側を紐付けますが

スクリーンショット 2020-03-31 8.37.02.png

UIButtonのカスタムクラスを作成した場合はさらにAttributes InspectorのTypeでCustomを選択する必要があるみたいです

スクリーンショット 2020-03-31 8.38.04.png

参考: https://qiita.com/keygx/items/9cda2b9bd6a4a32c2001

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む