ios - स्विफ्ट 3: UIScrollView और(निष्क्रिय) इशारे की पहचानकर्ता



swift cocoa-touch (1)

यदि परस्पर विरोधी इशारे के पहचानकर्ता को एक साथ पहचाने जाने की जरूरत है, तो आप इशारे के उपयोगकर्ता का उपयोग कर सकते हैं (_: चाहिए , पता होना चाहिए कि समय-समय पर)

मैं तेज 3 में हूँ और मेरे पास एक ऐसा वर्ग है जो UIScrollView का उपवर्ग है यह रहा:

import SpriteKit

/// Scroll direction
enum ScrollDirection {
    case vertical
    case horizontal
}

class CustomScrollView: UIScrollView {

    // MARK: - Static Properties

    /// Touches allowed
    static var disabledTouches = false

    /// Scroll view
    private static var scrollView: UIScrollView!

    // MARK: - Properties

    /// Current scene
    private let currentScene: SKScene

    /// Moveable node
    private let moveableNode: SKNode

    /// Scroll direction
    private let scrollDirection: ScrollDirection

    /// Touched nodes
    private var nodesTouched = [AnyObject]()

    // MARK: - Init
    init(frame: CGRect, scene: SKScene, moveableNode: SKNode, scrollDirection: ScrollDirection) {
        self.currentScene = scene
        self.moveableNode = moveableNode
        self.scrollDirection = scrollDirection
        super.init(frame: frame)

        CustomScrollView.scrollView = self
        self.frame = frame
        delegate = self
        indicatorStyle = .white
        isScrollEnabled = true
        isUserInteractionEnabled = true
        //canCancelContentTouches = false
        //self.minimumZoomScale = 1
        //self.maximumZoomScale = 3

        if scrollDirection == .horizontal {
            let flip = CGAffineTransform(scaleX: -1,y: -1)
            transform = flip
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    /// Began
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("begin " + String(CustomScrollView.disabledTouches))

        for touch in touches {
            let location = touch.location(in: currentScene)
            guard !CustomScrollView.disabledTouches else { return }

            /// Call touches began in current scene
            currentScene.touchesBegan(touches, with: event)

            /// Call touches began in all touched nodes in the current scene
            nodesTouched = currentScene.nodes(at: location)
            for node in nodesTouched {
                node.touchesBegan(touches, with: event)
            }
        }
    }

    /// Moved
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("moved " + String(CustomScrollView.disabledTouches))

        for touch in touches {
            let location = touch.location(in: currentScene)

            guard !CustomScrollView.disabledTouches else { return }

            /// Call touches moved in current scene
            currentScene.touchesMoved(touches, with: event)

            /// Call touches moved in all touched nodes in the current scene
            nodesTouched = currentScene.nodes(at: location)
            for node in nodesTouched {
                node.touchesMoved(touches, with: event)
            }
        }
    }

    /// Ended
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

        for touch in touches {
            let location = touch.location(in: currentScene)

            guard !CustomScrollView.disabledTouches else { return }

            /// Call touches ended in current scene
            currentScene.touchesEnded(touches, with: event)

            /// Call touches ended in all touched nodes in the current scene
            nodesTouched = currentScene.nodes(at: location)
            for node in nodesTouched {
                node.touchesEnded(touches, with: event)
            }
        }
    }

    /// Cancelled
    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {

        print("cancelled " + String(CustomScrollView.disabledTouches))
        for touch in touches {
            let location = touch.location(in: currentScene)

            guard !CustomScrollView.disabledTouches else { return }

            /// Call touches cancelled in current scene
            currentScene.touchesCancelled(touches, with: event)

            /// Call touches cancelled in all touched nodes in the current scene
            nodesTouched = currentScene.nodes(at: location)
            for node in nodesTouched {
                node.touchesCancelled(touches, with: event)
            }
        }
    }
}

// MARK: - Touch Controls
extension CustomScrollView {

    /// Disable
    class func disable() {
        CustomScrollView.scrollView?.isUserInteractionEnabled = false
        CustomScrollView.disabledTouches = true
    }

    /// Enable
    class func enable() {
        CustomScrollView.scrollView?.isUserInteractionEnabled = true
        CustomScrollView.disabledTouches = false
    }
}

// MARK: - Delegates
extension CustomScrollView: UIScrollViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if scrollDirection == .horizontal {
            moveableNode.position.x = scrollView.contentOffset.x
        } else {
            moveableNode.position.y = scrollView.contentOffset.y
        }
    }
}

इसका मुख्य कार्य स्क्रॉल करने योग्य मेनू बनाना है, और अधिकांश भाग के लिए यह काम करता है मैं GameScene में एक ऑब्जेक्ट का निर्माण करता हूं, और यह कैसे काम करता है यह है कि जब एक टच पंजीकृत होता है, तो कस्टमस्क्रॉलदृश्य में ओवरराइड टच फंक्शंस (टचबगान, टच मॉउड आदि) को बुलाया जाता है, जो तब गेमस्सीन में टच फ़ंक्शन को कॉल करता है। ऐसा होता है, मेनू स्क्रॉल ठीक है, और GameScene के तरीकों को बुलाया जाता है

पकड़ मेरे अधिरोहित कार्यों (और गेमस्केन के) को केवल तभी बुलाया जाता है जब आप क्षैतिज रूप से स्वाइप करते हैं जब आप ऊपर या नीचे (एक निश्चित डिग्री से पहले) स्वाइप करते हैं, तो मेनू अभी भी स्क्रॉल करता है, लेकिन मुझे लगता है कि यह यूआईएसक्रोलवियस के स्पर्श विधियों को बुलाया जा रहा है।

जब आप खड़ी हों, तो मेरी स्पर्श रद्द की गई विधि को बुलाया जाता है, जिससे मुझे लगता है कि यह यूआईएसक्रोलविय के इशारे के पहचानकर्ताओं (पैन / ड्रैग पहचानकर्ता मुझे लगता है) के साथ कुछ करना है, जब वे नहीं होनी चाहिए।

क्या यह मामला है? यदि हां, तो क्या मैं पहचानकर्ता को अक्षम कर सकता हूँ? और अगर मैं कर सकता हूं, तो क्या? एक तरफ नोट पर, यह सबसे अच्छा (या कम से कम एक स्वीकार्य) तरीका है UIScrollView को लागू करने के लिए ताकि GameScene के स्पर्श तरीकों को अभी भी कहा जाता है?





uigesturerecognizer