Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将UILabel从点A拖动到点B_Iphone_Objective C_Iphone Sdk 3.0_Uilabel - Fatal编程技术网

Iphone 将UILabel从点A拖动到点B

Iphone 将UILabel从点A拖动到点B,iphone,objective-c,iphone-sdk-3.0,uilabel,Iphone,Objective C,Iphone Sdk 3.0,Uilabel,如何在iPhone应用程序上将UILabel从a点拖到B点?基本上,您需要自己构建功能。可以通过在包含完整可拖动区域的superview中执行此操作。该方法可以告诉您触摸点是否位于要拖动的标签中 从那里,您可以覆盖更新UILabel位置的方法,使其与手指对齐。更新标签的位置将自动为您重新绘制标签 一旦开始拖动,我还建议您注意第一次触摸的UILabel内的位置,并以手指始终位于UILabel内的该点的方式处理重新定位。一个更容易编码但外观更差的版本是简单地将标签的左上角重新定位到手指所在的位置,

如何在iPhone应用程序上将UILabel从a点拖到B点?

基本上,您需要自己构建功能。可以通过在包含完整可拖动区域的superview中执行此操作。该方法可以告诉您触摸点是否位于要拖动的标签中

从那里,您可以覆盖更新
UILabel
位置的方法,使其与手指对齐。更新标签的位置将自动为您重新绘制标签

一旦开始拖动,我还建议您注意第一次触摸的
UILabel
内的位置,并以手指始终位于
UILabel
内的该点的方式处理重新定位。一个更容易编码但外观更差的版本是简单地将标签的左上角重新定位到手指所在的位置,但这可能会使标签在第一次开始拖动时出现跳跃

听起来可能有点吓人,但其实没那么糟糕——总共只有几行代码。除非您有可能重叠的视图。这是另外几行,取决于您想要如何处理它。

//MARK:-Touch函数
// 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
    }
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){ guard let location=touch.first?.PrecisionLocationView(quoteView)else{return} if quoteView.pointInside(位置,withEvent:event){ locationInView=location.y isInButton=true }否则{ isInButton=false } } 覆盖功能触摸移动(触摸:设置,带事件:UIEvent?){ 如果伊辛按钮{ guard let totalYMovement=touch.first?.PrecisionLocationView(self.view).y, locationInView=self.locationInView-else{return} 变量yMovement=总移动-QuoteView位置 如果位置视图>=(self.quoteView.frame.height/2){ //工作! yMovement=yMovement-(位置视图-(self.quoteView.frame.height/2)) }否则{ yMovement=yMovement+((self.quoteView.frame.height/2)-位置视图) } self.quoteView.transform.ty=yMovement } }
我使用上面的代码沿y轴平移视图。quoteViewLocation变量是一个可获取的CGPoint,返回

self.view.frame.height/2

locationInView是一个可选的CGPoint,每次点击要转换的视图内部时都会设置该CGPoint

您可以使用“我的代码”将按钮放置在视图中的任何位置,只需确保quoteViewLocation(无论您将如何称呼它)变量返回将视图水平平分的CGPoint.y。此点必须是superview的对应点。我的意思是,如果你有一个高度为40点的儿童视角和一个高度为40点的超视点,并且在超视距中,孩子的视角集中在中间点,你可能认为正确的CG点返回是20。不!虽然这是子视图的正确中心Y,但超级视图的中心是200。返回superview的点

您必须这样做以保持转换平滑

如果要沿x轴移动视图,也可以这样做

如果我错过了什么或是误插了眼泪。我也在这里学习


谢谢

一旦您有了要在拖动中移动的标签的句柄,就可以调用[self-bringSubviewToFront:label];它将与其他所有内容重叠(如果你想这样做的话)。