如何在我的iPhone应用程序中将UILabel从A点拖到B点?
答案 0 :(得分:3)
基本上,您需要自己构建功能。您可以在包含完整可拖动区域的超级视图中通过listening to touches执行此操作。方法hitTest:withEvent:
可以告诉您触地点是否在要拖动的标签中。
从那里,您可以覆盖touchesMoved:withEvent:
方法来更新UILabel
的位置,以使其与手指保持一致。更新标签的位置将自动为您重绘。
Here's a relevant question for iphone drag/drop
一旦你进行拖动工作,我还建议你注意第一次触摸所在的UILabel
内的位置,并处理重新定位,使得手指始终位于该点之内UILabel
。更容易编码但看起来更糟糕的版本是简单地重新定位,例如,标签的左上角是手指所在的位置,但这可能会使标签在首次开始拖动时显示为跳跃。
这可能听起来令人生畏,但实际上并没有那么糟糕 - 只需几行代码。除非您有可能重叠的视图。这是另外几行,取决于你想要如何处理它。
答案 1 :(得分:0)
// MARK: - Touch Functions
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
guard let location = touches.first?.preciseLocationInView(quoteView) else { return }
if quoteView.pointInside(location, withEvent: event) {
locationInView = location.y
isInButton = true
} else {
isInButton = false
}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
if isInButton {
guard let totalYMovement = touches.first?.preciseLocationInView(self.view).y,
locationInView = self.locationInView else { return }
var yMovement = totalYMovement - quoteViewLocation
if locationInView >= (self.quoteView.frame.height / 2) {
// Works!
yMovement = yMovement - (locationInView - (self.quoteView.frame.height / 2))
} else {
yMovement = yMovement + ((self.quoteView.frame.height / 2) - locationInView)
}
self.quoteView.transform.ty = yMovement
}
}
我使用上面的代码沿y轴平移视图。 quoteViewLocation变量是一个gettable CGPoint,它返回
self.view.frame.height / 2
locationInView是一个可选的CGPoint,每次点击要转换的视图时都会设置它。
您可以使用我的代码将按钮放在视图中的任何位置,只需确保您的quoteViewLocation(无论您将调用它)变量返回CGPoint.y水平平分视图。这一点必须是superview的对应点。我的意思是,如果你有一个高度为40点的儿童视图和一个高度为40点的超级视图,并且子视图在超级视图的中间位于中心,你可能认为正确的CGPoint到回来是20.不!虽然这是子视图的正确中心Y,但超视图的中心是200.返回超视图的CGPoint。
您必须这样做以保持转换顺利。
如果你想沿x轴移动一个视图,那就是同样的想法。
如果我错过任何事情或错误地撕裂了我。也想在这里学习。
由于