過去のコードを修正します
理由
- 数日前にSwiftUIでDragやPinchを利用したくて 私の過去のこれを利用したらPinchができない? なので修正しました 過去には作動したと思いますが現在ではDragしか作動しません 2022/2/8
SwiftのDragやPinchの挙動をSwiftUIで実現します
目的
- Swiftの? 「UIPanGestureRecognizer」や「UIPinchGestureRecognizer」の挙動でアイコンとかを移動させたりZoomしたりの作成
忙しい人はContentView.swiftをすり替えてください
必要な条件
- 新規作成で命名はお好みです
- SwiftUIにチェックを入れること
- 画像はシステム画像を使用しています
ContentView.swift
ContentView.swift
//
// DragAppleLogo🌙.swift
// SwiftUITest
//
// Created by 福田 敏一 on 2022/2/11.
// Copyright © 2019 株式会社パパスサン. All rights reserved.
//
// ❇️ ℹ️ 🚨 🎀 📅 ☼ ☕︎ 👀 💼 👑 📢 🧨 💎 🎡 🏕 🏖 🚗 🖲 🎁 📌 ⛑ ✚ 😍 ♻️ 💠 🔆 🅿️ 🔰 ✅ 🌏 🌙 💌 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣
import SwiftUI
struct DragGesture🌙: View {
@State private var offset: CGSize = .zero
@State private var newOffset: CGSize = .zero
@State private var scale: CGFloat = 1.0
//@State private var finalscale: CGFloat = 1.0//🌙🌙🌙・不要
var body: some View {
let dragGesture = DragGesture(minimumDistance: 0.0, coordinateSpace: .local)
.onChanged({ value in
self.offset.width = value.translation.width + self.newOffset.width
self.offset.height = value.translation.height + self.newOffset.height
}).onEnded({ value in
self.offset.width = value.translation.width + self.newOffset.width
self.offset.height = value.translation.height + self.newOffset.height
self.newOffset.width = self.offset.width
self.newOffset.height = self.offset.height
})
//let magnificationGesture = MagnificationGesture(minimumScaleDelta: 0.0)//🌙🌙🌙・不要
return GeometryReader { geometry in
Image(systemName: "trash")
.resizable()
.scaleEffect(self.scale)
.frame(width: 200.0, height: 200.0)
.gesture(MagnificationGesture(minimumScaleDelta: 0.0)
.onChanged { value in
//let newScale = self.scale * value//🌙🌙🌙・不要
//self.scale = newScale//🌙🌙🌙・不要
self.scale = value//🌙🌙🌙・上記をこれに変更
}.onEnded { value in
print("通過・value -> \(value)")
})
}.offset(x: offset.width, y: offset.height).simultaneousGesture(dragGesture)
//.scaleEffect(self.scale).simultaneousGesture(magnificationGesture)//🌙🌙🌙・不要
}
}
struct DragGesture🌙_Previews: PreviewProvider {
static var previews: some View {
DragGesture🌙()
}
}
/*🌙🌙🌙・過去のコード
//
// ContentView.swift
// SwiftUIGestureView
//
// Created by 福田 敏一 on 2020/01/07.
// Copyright © 2020 株式会社パパスサン. All rights reserved.
//
import SwiftUI
struct ContentView: View {
@State private var offset: CGSize = .zero
@State private var newOffset: CGSize = .zero
@State private var scale: CGFloat = 1.0
var body: some View {
let dragGesture = DragGesture(minimumDistance: 0.0, coordinateSpace: .local)
.onChanged({ value in
self.offset.width = value.translation.width + self.newOffset.width
self.offset.height = value.translation.height + self.newOffset.height
}).onEnded({ value in
self.offset.width = value.translation.width + self.newOffset.width
self.offset.height = value.translation.height + self.newOffset.height
self.newOffset.width = self.offset.width
self.newOffset.height = self.offset.height
})
let magnificationGesture = MagnificationGesture(minimumScaleDelta: 0.0)
return GeometryReader { geometry in
Image(systemName: "trash")
.resizable()
.frame(width: 200.0, height: 200.0)
.gesture(MagnificationGesture(minimumScaleDelta: 0.0)
.onChanged { value in
let newScale = self.scale * value
self.scale = newScale
}.onEnded { value in
print("通過・value -> \(value)")
})
}.offset(x: offset.width, y: offset.height).simultaneousGesture(dragGesture)
.scaleEffect(self.scale).simultaneousGesture(magnificationGesture)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
*/
//
// ContentView.swift
// SwiftUIGestureView
//
// Created by 福田 敏一 on 2020/01/07.
// Copyright © 2020 株式会社パパスサン. All rights reserved.
//
import SwiftUI
struct ContentView: View {
@State private var offset: CGSize = .zero
@State private var newOffset: CGSize = .zero
@State private var scale: CGFloat = 1.0
var body: some View {
let dragGesture = DragGesture(minimumDistance: 0.0, coordinateSpace: .local)
.onChanged({ value in
self.offset.width = value.translation.width + self.newOffset.width
self.offset.height = value.translation.height + self.newOffset.height
}).onEnded({ value in
self.offset.width = value.translation.width + self.newOffset.width
self.offset.height = value.translation.height + self.newOffset.height
self.newOffset.width = self.offset.width
self.newOffset.height = self.offset.height
})
let magnificationGesture = MagnificationGesture(minimumScaleDelta: 0.0)
return GeometryReader { geometry in
Image(systemName: "trash")
.resizable()
.frame(width: 200.0, height: 200.0)
.gesture(MagnificationGesture(minimumScaleDelta: 0.0)
.onChanged { value in
let newScale = self.scale * value
self.scale = newScale
}.onEnded { value in
print("通過・value -> \(value)")
})
}.offset(x: offset.width, y: offset.height).simultaneousGesture(dragGesture)
.scaleEffect(self.scale).simultaneousGesture(magnificationGesture)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
私の感想なんですが?
やはりSwiftUIは新規の言語なんですね? 苦労しますね?
挙動は私の思う通りになりますが? 私の環境だけでしょうか? 不思議な箇所を発見しました、それは「print("通過・value -> (value)")」の部分です
起動してPinchをしてから「Simulator」の上下ではなく両サイドの画面以外の黒いフチをタップする場合と画面のゴミ箱のアイコンとそれ以外を画面内部をタップするとprint文が実行されますね? 私はpinchが終わった後にprint文が実行されると思い? print文のコードを書きましたが実行されません? 酷いのは両サイドをタップすると予想以外のvalueの値が表示されます、まっ、pinchで「.onEnded」を利用する場合はpinchでアイコンのサイズを変更したのに指を離した瞬間に変化したら意味がないのでしょう? pinchが終わってからアイコンをタップして元のサイズに戻すとか? 多分、それが正解な挙動でしょうね? 結局、私の理解が低い結果でした、誠に勉強になりました、でも、実機では実機の両サイドのタップでは変な挙動はありませんよ?
ここまで