gpt4 book ai didi

ios - 在 UIViewController 显示为 3DTouch 预览时检测 UITouches

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:38 25 4
gpt4 key购买 nike

是否可以从当前用作 3D Touch 的 previewingContext View Controller 的 UIViewController 检测触摸并获取触摸位置? (我想在触摸从左向右移动时更改预览 Controller 内的图像)

我已经尝试了 touchesBegantouchesMoved 它们都没有被触发。

class ThreeDTouchPreviewController: UIViewController {

func getLocationFromTouch(touches: Set<UITouch>) -> CGPoint?{
guard let touch = touches.first else { return nil }
return touch.location(in: self.view)
}
//Not fired
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

let location = getLocationFromTouch(touches: touches)
print("LOCATION", location)
}
//Not fired
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let location = getLocationFromTouch(touches: touches)
print("LOCATION", location)
}
}

甚至尝试添加一个 UIPanGesture。

尝试复制 FaceBook 的 3D Touch 功能,用户可以从左向右移动手指来更改当前显示的图像。上下文视频:https://streamable.com/ilnln

最佳答案

如果您想获得与 FaceBook 的 3D Touch 功能相同的结果,您需要创建自己的 3D Touch 手势类

    import UIKit.UIGestureRecognizerSubclass

class ForceTouchGestureRecognizer: UIGestureRecognizer {

var forceValue: CGFloat = 0
var isForceTouch: Bool = false

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesBegan(touches, with: event)
handleForceWithTouches(touches: touches)
state = .began
self.isForceTouch = false
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesMoved(touches, with: event)
handleForceWithTouches(touches: touches)
if self.forceValue > 6.0 {
state = .changed
self.isForceTouch = true
}
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesEnded(touches, with: event)
state = .ended
handleForceWithTouches(touches: touches)
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
super.touchesCancelled(touches, with: event)
state = .cancelled
handleForceWithTouches(touches: touches)
}

func handleForceWithTouches(touches: Set<UITouch>) {
if touches.count != 1 {
state = .failed
return
}

guard let touch = touches.first else {
state = .failed
return
}
forceValue = touch.force
}
}

现在您可以在 viewDidLoad 方法中的 ViewController 中添加此手势

override func viewDidLoad() {
super.viewDidLoad()
let gesture = ForceTouchGestureRecognizer(target: self, action: #selector(imagePressed(sender:)))
self.view.addGestureRecognizer(gesture)
}

现在您可以在 Storyboard 中管理您的 Controller UI。在UICollectionViewUIImageView上方中间添加cover view,并在代码中与IBOutlets连接。

现在您可以为手势添加处理程序方法

func imagePressed(发件人:ForceTouchGestureRecognizer){

let location = sender.location(in: self.view)

guard let indexPath = collectionView?.indexPathForItem(
at: location) else { return }

让 image = self.images[indexPath.row]

switch sender.state {
case .changed:
if sender.isForceTouch {
self.coverView?.isHidden = false
self.selectedImageView?.isHidden = false
self.selectedImageView?.image = image
}

case .ended:
print("force: \(sender.forceValue)")
if sender.isForceTouch {
self.coverView?.isHidden = true
self.selectedImageView?.isHidden = true
self.selectedImageView?.image = nil
} else {
//TODO: handle selecting items of UICollectionView here,
//you can refer to this SO question for more info: https://stackoverflow.com/questions/42372609/collectionview-didnt-call-didselectitematindexpath-when-superview-has-gesture
print("Did select row at indexPath: \(indexPath)")
self.collectionView?.selectItem(at: indexPath, animated: true, scrollPosition: .centeredVertically)
}

default: break
}

从这一点开始,您需要自定义您的 View ,使其看起来与 Facebook 相同。

我还在 GitHub 上创建了一个小示例项目 https://github.com/ChernyshenkoTaras/3DTouchExample演示一下

关于ios - 在 UIViewController 显示为 3DTouch 预览时检测 UITouches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44666454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com