「チェックボックス」 ・「お気に入り」に続いて、「いいね」ボタンも作ったので、紹介します。
基本的な構成はお気に入りボタンと大きく変わりませんが、「いいね」数も表示できるようにしています。
【SwiftUI】「いいね」ボタンを作ってみる
LikeButton
※ボタンの画像を任意でご用意ください。
struct LikeButton: View {
@Binding var isLike: Bool
@Binding var numberOfLikes: Int
private var onTapped: (() -> Void)?
init(isLike: Binding<Bool>, numberOfLikes: Binding<Int>, onTapped: (() -> Void)? = nil) {
self._isLike = isLike
self._numberOfLikes = numberOfLikes
self.onTapped = onTapped
}
var body: some View {
HStack {
configureLikeImage()
Text("\(numberOfLikes)")
}
}
private func configureLikeImage() -> AnyView {
var imageName = "icon_like_off"
if self._isLike.wrappedValue {
imageName = "icon_like_on"
}
return AnyView(
Image(imageName)
.resizable()
.frame(width: 20, height: 20)
.onTapGesture {
self._isLike.wrappedValue.toggle()
if self._isLike.wrappedValue {
self._numberOfLikes.wrappedValue += 1
} else {
self._numberOfLikes.wrappedValue -= 1
}
self.onTapped?()
}
)
}
}
引数は3つです。
isLike: Binding<Bool> には LikeButton が保持する Bool 値とバインディングさせる @State(または @Publish)の Bool 変数を渡します。
numberOfLikes: Binding<Int> には LikeButton が保持するいいね数とバインディングさせる @State(または @Publish)の Int 変数を渡します。
onTapped: @escaping () -> Void にはタップ時に行いたい処理のクロージャを渡します。
Image の .onTapGesture で isLike を切り替えています。また、登録したクロージャも実行されます。
画像は、isLike によって、アクティブ時の画像と非アクティブ時の画像が切り替わります。
使用例
struct ContentView: View {
@State private var isLike = false
@State private var numberOfLikes = 10
var body: some View {
VStack {
Spacer()
LikeButton(isLike: $isLike, numberOfLikes: $numberOfLikes, onTapped: {
self.doSomething()
})
Spacer()
}
}
private func doSomething() {}
}
以上、「いいね」ボタンのサンプルを紹介しました。
以下の関連記事も是非ご参考下さい。
コメントを残す