如何在我的 iPhone 应用程序上将 UILabel 从 A 点拖到 B 点?
2 回答
基本上,您需要自己构建功能。您可以通过在包含完整可拖动区域的超级视图中收听触摸来做到这一点。该方法hitTest:withEvent:
可以告诉您着陆点是否在要拖动的标签中。
从那里,您可以重写该touchesMoved:withEvent:
方法以更新 的位置UILabel
以使其与手指对齐。更新标签的位置会自动为您重绘它。
一旦你开始拖动,我还建议注意UILabel
第一次触摸的位置,并以手指始终在UILabel
. 一个更容易编码但看起来更糟糕的版本是简单地将标签的左上角重新定位到手指所在的位置,但这可能会使标签在第一次开始拖动时出现跳跃。
这听起来可能令人生畏,但实际上并没有那么糟糕——总共只有几行代码。除非您有可能重叠的视图。那是另外几行,这取决于您要如何处理它。
// 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 变量是一个可返回的 CGPoint
self.view.frame.height / 2
locationInView 是一个可选的 CGPoint,每次在要转换的视图内点击时设置它。
您可以使用我的代码将按钮放置在视图中的任何位置,只需确保您的 quoteViewLocation(无论您要如何称呼它)变量返回水平平分视图的 CGPoint.y。这个点必须是superview的对应点。我的意思是,如果您有一个高度为 40 点的子视图和一个高度为 40 点的超级视图,并且子视图位于超级视图中间,您可能会认为正确的 CGPoint回报是 20。不!虽然这是子视图的正确中心 Y,但超级视图的中心是 200。返回超级视图的 CGPoint。
您必须这样做以保持转换顺利。
如果您想沿 x 轴移动视图,也是同样的想法。
如果我错过了任何事情或说错话了。也想在这里学习。
谢谢