这是用于控制具有泛功能视图的视图的代码.
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中没有约束,但它确实被定义并连接到故事板中的输出端。
发布于 2022-06-06 01:57:08
解决方案是更改函数,以便在发生更改的情况下更新约束之后,启动和更改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
}
}https://stackoverflow.com/questions/72506943
复制相似问题