0

在我的应用程序中,我使用UILongPressGestureRecognizer在屏幕上拖动视图。这个视图有一些子视图,包括一个UILabel使用约束布局的子视图。当我开始拖动时,我确保从拖动的视图中删除所有定位约束(我保留宽度和高度约束),因为我会随着手势识别器的变化手动更新框架。这很好用,但是当我在拖动时更新子视图标签的文本时,被拖动的视图会在一瞬间跳转到 (0,0),但在我拖动更多后会返回到正确的位置,这会调用另一个更新到框架.

当使用.changed状态调用手势识别器时,将运行以下代码:

let location = gesture.location(in: calendar.view)
moveView(with: location)

这工作得很好,视图跟随手指并且不会跳来跳去。

现在我想添加一个随着位置变化而更新的标签:

let location = gesture.location(in: calendar.view)
moveView(with: location)

movingView.label.text = "Some Text: \(location.x ?? "Error")"

现在视图一直跳转到 (0,0)。

我试图通过采用旧框架然后在更新文本后设置它来解决这个问题,如下所示:

let location = gesture.location(in: calendar.view)
moveView(with: location)

let oldFrame = movingView.frame
movingView.label.text = "Some Text: \(location.x ?? "Error")"
//movingView.layoutIfNeeded() -> tried with this too, to no effect
movingView.frame = oldFrame

然而,视图仍然跳转到 (0,0)。所以我的问题是,对此可以做些什么?如何在UILabel不弄乱视图拖动的情况下设置文本?

4

1 回答 1

2

保持视图与所有约束保持原样,并在更改transform时用于移动视图gestureRecognizer.location

label.transform = CGAffineTransform.identity.translatedBy(x: location.x, y: location.y)
于 2018-01-29T22:51:01.030 回答