使用手势在Swift中移动标签位置

4

我在我的视图控制器中有一个标签。我正在尝试每次点击标签时将标签的位置向左移动50个点。这是我到目前为止的代码,但是模拟中标签不会移动。我在标签上设置了约束条件。它大约有100个单位的宽度和50个单位的高度,也位于视图控制器的中心。

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let tapGesture = UITapGestureRecognizer(target: gestureLabel, action: #selector(moveLabel))
    gestureLabel.addGestureRecognizer(tapGesture)

}

func moveLabel(){
    if(left){
        moveLeft()
    }
    else{
        moveRight()
    }

}

func moveLeft(){
    let originalX = gestureLabel.frame.origin.x
    if(originalX < 0){
        bringIntoFrame()
    }
    else{
        gestureLabel.frame.offsetBy(dx: -50, dy: 0)
    }
}

你需要更改约束的“constant”属性,而不是框架。 - Paulw11
除了Paulw11的评论之外,您还需要为水平约束创建一个属性,这样您就可以执行以下操作:horizontal.constant -= 50; view.layoutIfNeeded() - Eendje
使用CGAffileTransform进行转换,而不是移动中心或更改偏移量。这样会更容易,也不需要额外的代码。 另外,设置:gestureLabel.userInteractionEnabled = true。 - Bibek
5个回答

1

1)通过编程方式创建一个标签(这样您就可以自由地移动它)

    var labelDinamic =  UILabel(frame: CGRectMake(0, 0,200, 200));
    labelDinamic.text = "test text";
    self.view.addSubview(labelDinamic);

2) 设置标签的初始位置(我建议使用具有约束条件的当前标签的位置。同时,隐藏您的约束标签,因为您不需要显示它)

labelDinamic.frame.origin.x = yourLabelWithConstraints.frame.origin.x;
labelDinamic.frame.origin.y = yourLabelWithConstraints.frame.origin.y;

3) 现在你可以通过属性将标签移动到任何位置

labelDinamic.frame.origin.x = 123
labelDinamic.frame.origin.y = 200

1
在这里,您可以将标签移动到任何位置。
 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {
            let position = touch.location(in: self.view)
            print(position.x)
            print(position.y)
            lbl.frame.origin = CGPoint(x:position.x-60,y:position.y-50)
        }
    }

0

UILabeluserInteractionEnabled默认为false。尝试将其设置为true


0
你创建了一个新的框架,但没有将其分配给标签。 offsetBy 不会直接更改框架,而是创建一个新的框架。

请替换

gestureLabel.frame.offsetBy(dx: -50, dy: 0)

使用

gestureLabel.frame = gestureLabel.frame.offsetBy(dx: -50, dy: 0)

但是上述方法假定您直接使用而不是使用约束。标准方法是使用“导向父视图”约束并更改其常量,而不是更改框架。


0

你应该更改标签的约束条件,而不是标签本身。

此外,你的target应该是self,而不是gestureLabel

另外,你可以进行动画处理。 :)

像这样:

class ViewController: UIViewController {

    // Centers the Meme horizontally.
    @IBOutlet weak var centerHorizontalConstraint: NSLayoutConstraint!

    // A custom UIView.
    @IBOutlet weak var okayMeme: OkayMeme!

    override func viewDidLoad() {
        super.viewDidLoad()
        addGestureRecognizer()
    }

    func addGestureRecognizer() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(moveMeme))
        okayMeme.addGestureRecognizer(tapGesture)
    }

    func moveMeme() {
        UIView.animate(withDuration: 2.0) {
            self.centerHorizontalConstraint.constant -= 50
            self.view.layoutIfNeeded()
        }
    }
}

"演示":

DEMO


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接