Slide 18
Slide 18 text
お気に入り追加時のハートマークAnimation対応(2)
タイムテーブル表示要素からタップされた位置を取得するための処理抜粋
// [NOTE] In order to calculate the value from GeometryReader, it is supported by assigning DragGesture to the Image element instead of Button.
HStack {
GeometryReader { geometry in
// MEMO: Since the coordinate values
are based on the inside of the View, ".local" is specified.
let localGeometry = geometry.frame(in: .local)
Image(isFavorite ? .icFavoriteFill : .icFavoriteOutline)
.resizable()
.renderingMode(.template)
.foregroundColor(
isFavorite ? AssetColors.Primary.primaryFixed.swiftUIColor : AssetColors.Surface.onSurfaceVariant.swiftUIColor
)
.frame(width: 24, height: 24)
.gesture(DragGesture(minimumDistance: 0, coordinateSpace: .global).onEnded { dragGesture in
// MEMO: The offset value in the Y-axis direction is subtracted for adjustment (decided by device orientation).
let adjustedLocationPoint = CGPoint(x: dragGesture.location.x, y: dragGesture.location.y - calculateTopMarginByDevideOrietation())
onTapFavorite(timetableItem, adjustedLocationPoint)
})
// MEMO: To adjust horizontal position, I'm subtracting half the size of Image (-12).
.position(x: localGeometry.maxX - 12, y: localGeometry.midY)
}
}
let onTapFavorite: (TimetableItem, CGPoint?) -> Void
タップ時には該当するTimetableItemと一緒
に.gestureで取得できたGeometryReaderの
値を一覧表示するView要素へ送る。
回転の考慮も必要
👉 基準はこのView内部
👉 .positionではView内部を基準としたX軸&Y軸方向の位置を指定する
👉 最終的に送られるのは画面全体を基準とした位置の値
- DragGestureを利用してボタンタップの様に見せている
- Drag終了時位置をClosureで送信(coordinateSpace: .global)