Беспорядочное движение iOS swift UITouch - PullRequest
0 голосов
/ 03 февраля 2019

gif симулятора
gif физического устройства

В моем быстром приложении я создал пользовательский график для отображения истории цен на акции.Одно касание пальца покажет эту конкретную цену акций и дату.касание двумя пальцами покажет среднее значение по ценам.

Моя проблема в том, что всякий раз, когда я запускаю свое приложение в симуляторе, оно прекрасно работает при использовании двух пальцев (опция + мышь).но при выполнении на физическом устройстве (iPhone 5s) и использовании двух пальцев две полосы, кажется, хаотично перемещаются и начинают мерцать.

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

    handleTouch(touches: touches)
}

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

}

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

    if delegate != nil{
        delegate!.chartStopped()
    }

}

private func handleTouch(touches:Set<UITouch>){
    if touches.count == 1{
        if let loc = touches.first?.location(in: self){
            let xRawValue = getClosest(searchValue: Int(loc.x), arrayValue: self.xRaw)
            let yRawValue = self.yRaw[self.xRaw.index(of: xRawValue)!]
            self.date = self.x[self.xRaw.index(of: xRawValue)!]
            self.price = self.y[self.xRaw.index(of: xRawValue)!]
            drawLines(xRawValue: xRawValue, yRawValue: yRawValue,lineLayer: lineLayer,circleLayer: circleLayer)
            //self.lineLayerS.path = UIBezierPath().cgPath
            //self.circleLayerS.path = UIBezierPath().cgPath
            if delegate != nil{
                delegate!.chartMoved(currentPrice: self.price, currentDate: self.date)
            }
        }
    } else if touches.count == 2{
        var touch = touches
        let touchF = touch.popFirst()
        if var loc1 = touchF?.location(in: self), var loc2 = touch.first?.location(in: self){
            if loc1.x > loc2.x{
                swap(&loc1, &loc2)
            }


            let xRawValue1 = getClosest(searchValue: Int(loc1.x), arrayValue: self.xRaw)
            let xIndex1 = self.xRaw.index(of: xRawValue1)!

            let yRawValue1 = self.yRaw[xIndex1]

            let xRawValue2 = getClosest(searchValue: Int(loc2.x), arrayValue: self.xRaw)
            let xIndex2 = self.xRaw.index(of: xRawValue2)!

            let yRawValue2 = self.yRaw[xIndex2]



            var averageSum = 0.0
            for i in xIndex1..<xIndex2{
                averageSum += Double(self.y[i])
            }
            averageSum = averageSum/Double(xIndex2-xIndex1)
            self.date = self.x[xIndex1]+"-"+self.x[xIndex2]
            self.price = Float(averageSum)
            if delegate != nil{
                delegate!.chartMoved(currentPrice: self.price, currentDate: self.date)
            }
            drawLines(xRawValue: xRawValue1, yRawValue: yRawValue1,lineLayer: lineLayer,circleLayer: circleLayer)
            drawLines(xRawValue: xRawValue2, yRawValue: yRawValue2,lineLayer: lineLayerS,circleLayer: circleLayerS)
        }
    }
}


private func drawLines(xRawValue xV:Int,yRawValue yV:Int,lineLayer:CAShapeLayer,circleLayer:CAShapeLayer){
    let line = UIBezierPath(rect: CGRect(x: xV, y:0, width: 1, height: Int(self.frame.height)))
    lineLayer.path = line.cgPath
    lineLayer.strokeColor = UIColor.black.cgColor
    circleLayer.path = UIBezierPath(ovalIn: CGRect(x: xV-4, y: yV-4, width: 8, height: 8)).cgPath;
    circleLayer.strokeColor = Colors.blueDark.cgColor
    circleLayer.fillColor = Colors.blueDark.cgColor
    self.layer.addSublayer(circleLayer)
}

https://www.youtube.com/watch?v=7RiWXxYh9pk&feature=youtu.be <- запись экрана симулятора <a href="https://www.youtube.com/watch?v=NfSb09NKxH4&feature=youtu.be" rel="nofollow noreferrer">https://www.youtube.com/watch?v=NfSb09NKxH4&feature=youtu.be <- запись экрана физического устройства </p>

1 Ответ

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

Вот один из способов решения проблемы.

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let touch = touch.location(in: self)

        //height --> height of your chart
        let touchArea = SKSpriteNode(color: .clear, size: CGSize(width: 20, height: 200))
        touchArea.position = touch
    }
}

Вы можете создать диапазон, в котором распознается первое касание, чтобы больше не было проблем.Проблема заключается в том, что когда ваши устройства распознают касание пальцем, устройство не может точно определить местоположение касания, поскольку вы одновременно касаетесь нескольких пикселей.

Apple решает эту проблему, позволяя расположить линию только по краям графика, как вы можете видеть в приложении для акций.

Дайте мне знать, сработало ли это.

...