swift Mac OS: заставьте трекпад отображать размер экрана для событий NSTouch - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь заставить сенсорные события использовать трекпад в качестве дисплея при его перемещении.

Я имею в виду следующее:

Рассмотрим дисплей ноутбука Mac и представьте, что он точно соответствует размеру трекпада, или именно так я хочу, чтобы реализовывались сенсорные события.,Ранее в NSEvent было нормализованное свойство координат xy, которое, возможно, дало мне это, но, похоже, оно устарело.

Ниже приведены переопределения touchBegan и touchMoved и то, что я имею в виду:

override func touchesBegan(with event: NSEvent) {
    CGDisplayMoveCursorToPoint(CGMainDisplayID(), event.location(in: overlayScene))
    let player = SCNAudioPlayer(source: tick)
    sineNode.addAudioPlayer(player)
}

override func touchesMoved(with event: NSEvent) {
    let location = event.location(in: overlayScene)
    guard let node = overlayScene.nodes(at: location).first else{
        if currentSKNode != nil{
            currentSKNode = nil
        }
        return
    }
    if currentSKNode != node{
        currentSKNode = node
    print(node.name)
    let player = SCNAudioPlayer(source: tick)
    sineNode.addAudioPlayer(player)
    }
}

Представьте себе читатель fgraph, где оси x и y центрированы точно по ширине / 2 и высоте / 2 трекпада.Когда я касаюсь его где-либо, это должно отражаться точно в окне приложений, которое установлено в полноэкранный режим.

В настоящее время курсор мыши, кажется, только частично перемещается по экрану, когда я делаю полное перемещение слева направо, следовательно, пытаюсь переместить курсор мыши в положение NSView, или в этом случае SKScene.

1 Ответ

0 голосов
/ 20 февраля 2019

Хорошо, получается, как упоминал Кент, нормализованная позиция не считается устаревшей, но я смотрел на NSEvent, а не на NSTouch.

Вот код для тех, кто сталкивается с такими же требованиями.Работает нормально, просто нужно выяснить, как сделать это максимально отзывчивым.

override func touchesMoved(with event: NSEvent) {
    DispatchQueue.main.async {
    let touch = event.touches(matching: .moved, in: self.sceneView).first
    let normalised = touch!.normalizedPosition
    let translated = CGPoint(x: self.width*normalised.x - self.widthCenter, y: self.height*normalised.y - self.heightCenter)
            guard let node = self.overlayScene.nodes(at: translated).first else{
                self.currentSKNode = nil
                return
            }
            if self.currentSKNode != node{
                self.currentSKNode = node
                let player = SCNAudioPlayer(source: self.tick)
                self.sineNode.addAudioPlayer(player)
            }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...