我添加了一个标签,并在单击按钮时使标签移动. 它的效果很好,直到一 但是,如果创建第二个标签,则创建的第一个标签将返回其原始位置. 我可以在维护现有位置的同时创建新标签吗?

    @IBAction func btnTextAction(_ sender: UIButton) {
        let label = UILabel()
        label.text = "Hello"
        label.textColor = .black
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        vMain.addSubview(label)

        NSLayoutConstraint.activate([
            label.centerXAnchor.constraint(equalTo: vMain.centerXAnchor),
            label.centerYAnchor.constraint(equalTo: vMain.centerYAnchor),
        ])
        
        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
        label.addGestureRecognizer(panGestureRecognizer)
        label.isUserInteractionEnabled = true
        
    }
    
    @objc func handlePanGesture(_ sender: UIPanGestureRecognizer) {
        guard sender.view != nil else { return }

        let translation = sender.translation(in: view)
        
        sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
        sender.setTranslation(CGPoint.zero, in: view)
    }

推荐答案

您添加了约束条件,将标签的中心约束为vMain的中心,因此当添加新标签时,所有内容都会根据约束条件再次布局,因此标签再次定位回中心.

如果您只希望标签initially位于中心,只需直接设置center即可:

@IBAction func btnTextAction(_ sender: UIButton) {
    let label = UILabel()
    label.text = "Hello"
    label.textColor = .black
    label.textAlignment = .center
    label.sizeToFit()
    vMain.addSubview(label)
    label.center = vMain.center
    
    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
    label.addGestureRecognizer(panGestureRecognizer)
    label.isUserInteractionEnabled = true
}

或者,您可以在handlePanGesture中删除约束,即第一次拖动视图时.

@objc func handlePanGesture(_ sender: UIPanGestureRecognizer) {
    guard let draggedView = sender.view else { return }

    let translation = sender.translation(in: view)
    NSLayoutConstraint.deactivate(view.constraints.filter { $0.firstItem as? NSObject == draggedView })
    draggedView.translatesAutoresizingMaskIntoConstraints = true
    
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPoint.zero, in: view)
}

Swift相关问答推荐

在列表项内的NavigationLink中的按钮无法正常工作

VisionOS发送通知

SWIFT中MAP的静态方法包装器

有没有一种方法可以迭代可编码的代码(例如,JSON解析中的每一项)?

如何在SwiftUI 4+(iOS 16+)中使用新的NavigationStack进行导航

文件命名&NumberForMatter+扩展名&:含义?

关闭 SwiftUI TabView 中的子视图

如何在visionOS中将模型锚定在用户头部上方?

RealityKit - 从中心zoom 模型

从一个范围减go 多个范围

为什么 SwiftUI 中 ForEach 的这个 Select 不起作用?

一组可散列的自定义元素插入相等的元素

如何为 Swift UI 视图定义 struct ?

持久化字符串列表属性 RealmSwift

您可以在运行时访问 Picker 元素并更改它们的 colored颜色 吗

如何在填充上添加 if else 语句? SwiftUI

在 Swift 中从 HTML 生成带有图像的 PDF 而不显示打印界面

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

Swift 中 NSFetchRequest 的多个 NSPredicates?

iOS/Swift:如何检测 UITextField 上的touch 动作