首页 > 解决方案 > 我目前在自动布局中更新 UIVIew 的约束时遇到问题

问题描述

我创建了一个自定义视图,其中添加了子视图,并且每个 UIView 对象都添加了一个 UIPanGestureRecognizer,但是当我在更新约束后选择 UIView 时会出现延迟。如果我将 UIView (sView) 拖出屏幕,下次我将视图拖到任一方向时,在平移手势识别器注册之前会有几秒钟的延迟。它不会立即注册平移手势。

我已经阅读了自动布局,并相信它在动画回调方法中配置正确。我在视图控制器中创建了一个可以访问更新约束的委托,并且 sView.leftConstraint 和 sView.rightConstraint 是我添加到表示可拖动 UIView 的自定义视图中的字段。

ScrollViewController 采用了一个协议,以便它可以访问被选择的视图并相应地更新约束。

任何帮助将不胜感激 :)

extension ScrollViewController: DragDelegate {

func draggedLeft(sView: DraggableView) {
    print("Dragged Left")

    confirmationLabel.text = ""
    sView.selectionLabel.text = "Not Selected"
    sView.cornerRadius = 7

    sView.rightConstraint?.isActive = false
    sView.leftConstraint?.isActive = false
    sView.leftConstraint?.constant = 1
    sView.leftConstraint?.isActive = true
//        sView.widthConstraint?.constant = 300


    UIView.animate(withDuration: 0.3) {
        sView.updateConstraints()
        self.contentView.setNeedsLayout()
        self.view.layoutIfNeeded()
    }
}
}


class OrderSelectionView: UIView {

var dView : DraggableView?
var dView2 : DraggableView?
let screenWidth = UIScreen.main.bounds.width

//I need to set up all the constraints in this class
//This will act almost like a container view


override init(frame: CGRect) {
    super.init(frame: frame)

    self.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)

    let margins = self.layoutMarginsGuide
    self.translatesAutoresizingMaskIntoConstraints = false

    dView = DraggableView(frame: frame)

    dView2 = DraggableView(frame: frame)
    guard let dragView = dView else {return}
    guard let dragView2 = dView2 else {return}

    dragView.translatesAutoresizingMaskIntoConstraints = false
    dragView.topAnchor.constraint(equalTo: laundryLabel.bottomAnchor, constant: 10).isActive = true

    let rightAnchor = NSLayoutConstraint(item: dragView, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1, constant: 0)
    let leftAnchor = NSLayoutConstraint(item: dragView, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1, constant: 0)

    dragView.widthAnchor.constraint(equalToConstant: 150).isActive = true
    dragView.heightAnchor.constraint(equalToConstant: 40).isActive = true
    dragView.leftConstraint = leftAnchor
    dragView.leftConstraint?.isActive = true
    dragView.rightConstraint = rightAnchor

    self.addSubview(dragView2)

    dragView2.translatesAutoresizingMaskIntoConstraints = false

    let laundryLabel2 = createLaundryLabel(lTitle: "Dry", constant: 100)

    dragView2.translatesAutoresizingMaskIntoConstraints = false
    dragView2.topAnchor.constraint(equalTo: laundryLabel2.bottomAnchor, constant: 10).isActive = true

    let rightAnchor2 = NSLayoutConstraint(item: dragView2, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1, constant: -50)
    let leftAnchor2 = NSLayoutConstraint(item: dragView2, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1, constant: 0)

    dragView2.widthAnchor.constraint(equalToConstant: 150).isActive = true
    dragView2.heightAnchor.constraint(equalToConstant: 40).isActive = true
    dragView2.leftConstraint = leftAnchor2
    dragView2.leftConstraint?.isActive = true
    dragView2.rightConstraint = rightAnchor2

}

标签: iosswiftuiviewautolayout

解决方案


推荐阅读