不稳定的运动iOS快速UITouch

时间:2019-02-03 04:53:36

标签: ios swift uitouch

simulator gif
physical device gif

在我的快速应用程序中,我制作了一个自定义图表以显示股票价格的历史记录。单指触摸即可显示特定的股票价格和日期。两指触摸将显示整个价格的平均值。

我的问题是,每当我在模拟器中执行我的应用程序时,使用两根手指(option + mouse)都可以正常工作。但是在物理设备(iPhone 5s)上执行操作并使用2根手指时,两个横条似乎不规则地移动并开始闪烁。

 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 <-模拟器屏幕记录 https://www.youtube.com/watch?v=NfSb09NKxH4&feature=youtu.be <-物理设备屏幕记录

1 个答案:

答案 0 :(得分:0)

这是解决问题的一种方法。

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通过允许将线条的位置仅显示在股票应用程序上的图表边缘来解决此问题。

让我知道它是否有效。