【发布时间】:2019-02-03 04:53:35
【问题描述】:
simulator gif
physical device gif
在我的 swift 应用程序中,我制作了一个自定义图表来显示股票价格的历史。单指触摸将显示特定的股票价格和日期。两指触摸将显示价格的平均值。
我的问题是,每当我在模拟器中执行我的应用程序时,它在使用两个手指(选项+鼠标)时运行良好。但是在物理设备(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.behttps://www.youtube.com/watch?v=NfSb09NKxH4&feature=youtu.be
【问题讨论】:
-
为什么不用
TapGestureHandler?处理原始触摸事件非常困难,不推荐(触摸绘图除外)。 -
我的意思是“UITapGestureRecognizer”developer.apple.com/documentation/uikit/uitapgesturerecognizer
-
@9dan 会记录连续的触摸动作吗?