簡體   English   中英

Swift PanGesture:管理約束的問題:新 Pan 上的 Flash

[英]Swift PanGesture : Problems Managing Constraints: Flash on New Pan

這是用於控制具有可平移視圖的視圖的代碼。

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
    }
}

它工作正常,除了開始一個新的平底鍋時,它會從最后一個平底鍋的末端跳到它的位置,然后瞬間跳回來,平底鍋就可以完成。 這次跳躍的方向與上一次平移的方向相同,因此第二次平移視圖不會跳躍,隨后的平移會向最后一次平移的方向跳躍,幅度大致相同。

這讓我覺得它與發送者狀態有關,但我不知道是什么。 如果最后一鍋的量少,或者起鍋慢,沒有閃光,但我一直無法理解這是從哪里來的。

正在平移的視圖在情節提要中沒有任何約束,但它確實被定義並連接到情節提要中的出口。

解決方案是更改函數,以便在更改的情況下更新約束后,啟動和更改都執行 CGAffineTransform:

@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
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM