Touchesmoved - 一次拖动更新多个元素

Posted

技术标签:

【中文标题】Touchesmoved - 一次拖动更新多个元素【英文标题】:Touchesmoved - updating multiple elements on single drag 【发布时间】:2016-09-04 08:33:55 【问题描述】:

我正在尝试在单击并拖动元素时更新多个图像。我已经实现了 touchesbegan、touchesmoved 和 touchesended,但是我不知道如何使 touchesmoved 效果多个图像。

我一直在网上搜索,但找不到任何关于此的指南。如果你能指出我正确的方向,或者给我一些基本的建议,那将不胜感激。

以下是示例图片:

编辑:以下是可能的示例图像:

What it should look like.

我希望能够通过相同的印刷机以相同的方式影响其他字母,改变它们的图片。这些图片是临时图片。

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
    print("touches began:\(touches)")


override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) 
            self.image = UIImage(named: "slot")!
        print("touches moved:\(touches)")
    

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) 
        self.image = UIImage(named: "tile")!
        print("touches ended")
    

【问题讨论】:

你有它应该如何工作的 gifs 吗? 它应该工作的方式是您将手指拖到每个元素上,然后将它们从像 E 的图片更改为像 S 的图片,并获取每个元素的值的字母。我发现一篇文章说在上面的超级视图中这样做可能是可取的?我添加了一个应该是什么样子的示例。 【参考方案1】:

如果我理解正确的话,应该是这样的:

class ChangableView: UIView 
    private var touchedImageView: UIImageView? 
        didSet 
            if oldValue == touchedImageView  return 
            if let oldValue = oldValue 
                oldValue.image = UIImage(named: "tile")!
            
            if let newValue = touchedImageView 
                newValue.image = UIImage(named: "slot")!
              
        
    

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
        guard let touch = touches.first else  return 
        updateTouchedImageViewWithTouch(touch, event: event)
    

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) 
        guard let touch = touches.first else  return 
        updateTouchedImageViewWithTouch(touch, event: event)
    

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) 
        touchedImageView = nil
    


private extension ChangableView 
    func updateTouchedImageViewWithTouch(touch: UITouch, event: UIEvent?) 
        let touchPoint = touch.locationInView(self)
        let touchedView = self.hitTest(touchPoint, withEvent: event)
        touchedImageView = touchedView as? UIImageView
    

此外,您的 UIViewController 应该有一个 ChangableView 的子类作为视图,并且不要忘记将所有 UIImageViews 的 userInteractionEnabled 属性设置为 YES。

【讨论】:

以上是关于Touchesmoved - 一次拖动更新多个元素的主要内容,如果未能解决你的问题,请参考以下文章

touchesbegin, touchesmoved, touchesended 问题

如何获得滑动/拖动触摸的增量

如何在 Swift 和 SpriteKit 中使用 UISwipeGestureRecognizer 而不是 touchesMoved?

SpriteKit touchesMoved 在 SKSpritenode 的子类中使用时不稳定

可在多个容器/网格之间拖动的元素

iPhone UIView touchesMoved: withEvent: 不会在 UIView 上使用手势识别器调用