首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift PanGesture :问题管理约束:新盘闪现

Swift PanGesture :问题管理约束:新盘闪现
EN

Stack Overflow用户
提问于 2022-06-05 11:30:48
回答 1查看 15关注 0票数 0

这是用于控制具有泛功能视图的视图的代码.

代码语言:javascript
复制
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var redRect: PaletteView!
    @IBOutlet var paletteTop : NSLayoutConstraint?
    @IBOutlet var paletteLeading : NSLayoutConstraint?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        addRedViewUI(tgt: redRect!)
        redRect.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(palettePan(_:))))
        redRect?.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate(paletteConstraints())
    }
    
    func addRedViewUI(tgt : PaletteView) {
        var pos = CGPoint(x: 10, y: 10)
        var size = CGSize(width: 200, height: 240)
        var v = UIView(frame: CGRect(origin: pos, size: size))
        v.backgroundColor = .black
        tgt.addSubview(v)
    }
    
    func paletteConstraints() -> Array<NSLayoutConstraint> {
        var constraints : Array<NSLayoutConstraint> = []
        constraints.append((redRect?.leadingAnchor.constraint( equalTo: view.leadingAnchor, constant: 100))!)
        paletteLeading = constraints.last
        constraints.append((redRect?.topAnchor.constraint( equalTo: view.topAnchor, constant: 100))!)
        paletteTop = constraints.last
        constraints.append((redRect?.widthAnchor.constraint(equalToConstant: 250))! )
        constraints.append((redRect?.heightAnchor.constraint(equalToConstant: 350))! )
        return constraints
    }
    
    func paletteConstraints(_ tgtView : PaletteView ) -> Array<NSLayoutConstraint> {
        var constraints : Array<NSLayoutConstraint> = []
        constraints.append((tgtView.leadingAnchor.constraint( equalTo: redRect!.leadingAnchor)))
        constraints.append((tgtView.topAnchor.constraint( equalTo: redRect!.topAnchor)))
        return constraints
    }
    
    @objc func palettePan(_ sender: UIPanGestureRecognizer) {
        let translation = sender.translation(in: view)
        switch sender.state {
        case .began:
            print("start \(redRect!.frame)")
            paletteLeading?.constant = redRect!.frame.origin.x
            paletteTop?.constant = redRect!.frame.origin.y
        case .changed:
            redRect!.transform = CGAffineTransform(translationX: translation.x, y: translation.y)
        case .ended:
            print("done \(redRect!.frame)")
        default:
            _ = true
        }
    }
}

class PaletteView : UIView {
    var lastPos: CGPoint = CGPoint(x: 20, y: 20)
    
    convenience init() {
        self.init(frame: CGRect(x: 10, y: 10, width: 200, height: 200))
        translatesAutoresizingMaskIntoConstraints = false
    }
}

它的工作很好,除了当开始一个新的锅,它从它的位置从最后一个锅结束,然后立即跳回来和锅可以完成。这个跳转的方向和最后一个平底锅是一样的,所以第二个平底锅--视图不会跳,然后平底锅--它跳到最后一个平底锅的方向上,数量大致相同。

这让我觉得这是与发送者状态相关的东西,但我不知道是什么。如果最后一个平底锅的数量很小,或者是开始缓慢,没有闪光灯,但我还不知道它是从哪里来的。

被平移的视图在storyBoard中没有约束,但它确实被定义并连接到故事板中的输出端。

EN

回答 1

Stack Overflow用户

发布于 2022-06-06 01:57:08

解决方案是更改函数,以便在发生更改的情况下更新约束之后,启动和更改CGAffineTransform:

代码语言:javascript
复制
@objc func palettePan(_ sender: UIPanGestureRecognizer) {
        let translation = sender.translation(in: view)
        switch sender.state {
        case .began:
            print("start \(redRect!.frame)")
            paletteLeading?.constant = redRect!.frame.origin.x
            paletteTop?.constant = redRect!.frame.origin.y
            redRect!.transform = CGAffineTransform(translationX: translation.x, y: translation.y)
        case .changed:
            redRect!.transform = CGAffineTransform(translationX: translation.x, y: translation.y)
        case .ended:
            print("done \(redRect!.frame)")
        default:
            _ = true
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72506943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档