根据即将推出的代码:
myButtonAction
运行一个耗时的任务,我发送到后台。我有一个平移手势,处理另一组动作的交互。 transChange.center = hitPoint
中的handleChangedPanGesture
行按预期工作,拖动元素并将其设置到我的点位置但是当myButtonAction
被激活并且用户继续与平移手势交互时, transChange
的位置在屏幕上不会更新,即使其值已由hitPoint
更新,它只是默认返回到“中心X”“中心Y”(静态位置),如AutoLayout中所定义。有趣的是,旋转扩展确实继续运行。一旦DispatchQueue.global().async
结束,平移功能将再次按预期工作。
@IBAction func myButtonAction(_ sender: Any) {
...
myButton.isEnabled = false
DispatchQueue.global().async {
self.addBlock(block) // This is a loop I send to the background
DispatchQueue.main.async {
self.myButton.isEnabled = true
}
}
}
@objc func handlePanGesture(gesture: UIPanGestureRecognizer) -> Void {
let point = gesture.location(in: gesture.view!)
switch gesture.state {
case .began:
handleBeganPanGesture(point)
case .changed:
handleChangedPanGesture(point)
case .ended:
handleEndPanGesture(point)
default: break
}
}
func handleChangedPanGesture(_ hitPoint: CGPoint) {
let myAngle = 2 * (hitPoint.x - panStartPoint.x)
transChange.rotate(degrees: myAngle)
transChange.center = hitPoint
...
}
编辑:注意我删除了AutoLayout约束,一般问题仍然存在。 UIImageView现在锚定在左上角。同样,它通常使用平移手势更新其位置,但仅在DispatchQueue未运行后台功能时才更新。如何在Dispatch运行时强制进行布局更新?这是两个显示两个场景的图像
我错过了什么?