将UILabel从A点拖到B点

时间:2009-09-18 00:44:41

标签: iphone objective-c iphone-sdk-3.0 uilabel

如何在我的iPhone应用程序中将UILabel从A点拖到B点?

2 个答案:

答案 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轴移动一个视图,那就是同样的想法。

如果我错过任何事情或错误地撕裂了我。也想在这里学习。

由于