ライブラリの機能を利用する/拡張する【Swift 4】
前節までの手順で、プロジェクトに組み込んだライブラリPMSuperButtonを実際に利用してみます。ライブラリの機能をそのまま利用する方法と、ライブラリの機能を拡張して利用する方法の2通りについて、例を挙げて説明します。
ライブラリの機能を利用する
CocoaPodsでインストールしたライブラリ内のクラスは、UIlkitやプロジェクト内に存在するクラスと同様に扱うことができます。例えば、次のようにストーリーボードでライブラリ内のUIを画面に配置することも可能です。サンプルでは、PMSuperButtonオブジェクトを画面に配置しています。
PMSuperButtonクラスはUIButtonクラスのサブクラスなので、ストーリーボードではUIButtonオブジェクトを配置した後にタブでクラスをPMSuperButtonクラスに切り替えて配置しています。
PMSuperButtonクラス内のプロパティも、ストーリーボード上で値を指定できます。
ストーリーボードでは特別に意識しなくて構いませんが、プログラムからライブラリを利用する場合にはimport文が必要です。PMSuperButtonオブジェクトを配置する画面では、リスト6の通りimport文でライブラリPMSuperButtonを利用することを宣言します。
import UIKit
import PMSuperButton
class ViewController: UIViewController {
@IBOutlet weak var button: PMSuperButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
button.touchUpInside{ // ---------------(1)
print("ボタンを押しました")
}
}
# 後略
}
import文を記述した後は、通常のクラスと同様に利用できます。サンプルでは、PMSuperButtonクラスのtouchUpInsideメソッドを利用してボタンが押された際の処理を記述しています(1)。
ライブラリを拡張する
ライブラリを導入してアプリの機能を拡充するだけでなく、ライブラリ内のクラスをさらにカスタマイズしてオリジナルの機能を作成することや、独立したクラスとして定義したい場合もあります。自分で作成したクラスの場合は、そのままクラスのソースコードに記述を追加すればさらなる機能を作成することは可能です。ですが、CocoaPodsでインストールしたライブラリの場合は、外部から導入したものなのでソースコードを変更することはできません。サブクラスやextensionを利用して機能を拡張します。
連載第1回で説明した通り、Swift 4ではprivateで定義されたプロパティやメソッドもextension内で利用できるようになったため、ライブラリの拡張もしやすくなっています。
サンプルでは次のようにボタンがハイライトした場合に、バウンドする機能の実装を考えてみます。
PMSuperButtonクラスの親クラスのUIButtonクラスが継承している、UIControlクラスのisHilightedプロパティの値がtrueになった際の処理として、ボタンがバウンドするアニメーションを入れます。プロパティの値が変更された処理に関しては連載第4回を参照してください。
最初に機能を拡張するためのクラスを定義します。次のように「SampleButton」の名前でPMSuperButtonクラスのサブクラスを宣言します。
import UIKit
import PMSuperButton
class SampleButton: PMSuperButton {
}
ライブラリのクラスを継承してサブクラスを作成する際に特別な処理は必要ありません。ただし、ライブラリを利用するのでimport文を忘れないようにしてください。isHilightedプロパティの値の変化に伴うアニメーションを次のように指定します。
class SampleButton: PMSuperButton {
override open var isHighlighted: Bool {
didSet {
if !isHighlighted { return } // ハイライトされた場合のみアニメーションを実行
self.transform = CGAffineTransform(scaleX: 0.4, y: 0.4) // スケールを指定 // ------(1)
self.alpha = 0.0
UIView.animate(withDuration: 0.2, // ------(2)
delay: 0,
animations: {
self.alpha = 1.0
},
completion: { Void in
UIView.animate(withDuration: 2.0, // ------(3)
delay: 0,
usingSpringWithDamping: CGFloat(0.20), // 振動の幅
initialSpringVelocity: CGFloat(6.0), // 速度
options: UIViewAnimationOptions.allowUserInteraction, // アニメーション中に操作は可能に
animations: {
self.transform = CGAffineTransform.identity // 恒等変換
},
completion: nil
)
}
)
}
}
}
ボタンに適応するアニメーションに関しては、遅延させてアニメーションを実行するanimate(withDuration:animations:completion:)メソッドと、バネ風のアニメーションを行うanimate(withDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:)メソッドを組み合わせて作成しています。
最初にボタンの縦横のサイズを0.4倍に縮小し、alphaを0.0にして不可視化しています(1)。その後、0.2秒後に可視化し(2)、バネ風のアニメーションに進みます(3)。バネ風のアニメーションは2秒で実行し、振動の幅/速度/オプション/変換の詳細に関してそれぞれ値を指定します。アニメーションに関しては、値の組み合わせ次第で思わぬ動きになることもあるので、実際にアプリを実行しながら確認してください。
SampleButtonクラスを作成した後は、前項と同様にストーリーボード上でSampleButtonオブジェクトを画面に配置します。
サンプルを実行すると、節の冒頭の画像のようにボタンがバウンドする動きが確認できます。
まとめ
今回のサンプルでは、一般に公開されているライブラリをアプリの中で利用し、機能を実装する方法について説明しました。外部のライブラリを利用して機能を作成することで、開発者自身が作成することの難しい高度な機能を、比較的簡単にアプリに実装できます。GitHub上では、Swift 4に対応した高度なライブラリが日々公開されているので、アプリを開発する際にはぜひ使ってみてください。
