【发布时间】:2021-06-24 13:25:40
【问题描述】:
当我使用滑块时,它会恢复到原来的位置。我不知道增加函数中发生了什么导致它这样做。我想在我不希望它们删除的代码中保留初始化约束。我只想在用户更改对象的滑块值时不恢复到原始位置。您可以在 gif 中看到发生了什么。
import UIKit
class ViewController: UIViewController {
var slizer = UISlider()
var oldCons = [NSLayoutConstraint]()
var viewDrag = UIImageView()
var panGesture = UIPanGestureRecognizer()
var widthConstraints: NSLayoutConstraint?
var tim: CGFloat = 50.0
var slidermultiplier: CGFloat = 0.6
override func viewDidLoad() {
super.viewDidLoad()
widthConstraints = viewDrag.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: slidermultiplier)
[viewDrag,slizer].forEach{
$0.translatesAutoresizingMaskIntoConstraints = false
view.addSubview($0)
}
NSLayoutConstraint.activate([
slizer.bottomAnchor.constraint(equalTo: view.bottomAnchor),
slizer.leadingAnchor.constraint(equalTo: view.leadingAnchor),
slizer.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.2),
slizer.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
])
slizer.addTarget(self, action: #selector(increase), for: .valueChanged)
viewDrag.backgroundColor = .orange
viewDrag.frame = CGRect(x: view.center.x-view.frame.width * 0.05, y: view.center.y-view.frame.height * 0.05, width: view.frame.width * 0.1, height: view.frame.height * 0.1)
panGesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView(_:)))
viewDrag.isUserInteractionEnabled = true
viewDrag.addGestureRecognizer(panGesture)
oldCons = [
viewDrag.centerYAnchor.constraint(equalTo: view.centerYAnchor),
viewDrag.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: tim),
viewDrag.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.3),
widthConstraints!,
]
NSLayoutConstraint.activate(oldCons)
}
@objc func sliderr() {
NSLayoutConstraint.deactivate(oldCons)
oldCons = [
viewDrag.centerYAnchor.constraint(equalTo: view.centerYAnchor),
viewDrag.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -tim),
viewDrag.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.3),
widthConstraints!,
]
NSLayoutConstraint.activate(oldCons)
}
@objc func draggedView(_ sender: UIPanGestureRecognizer) {
self.view.bringSubview(toFront: viewDrag)
let translation = sender.translation(in: self.view)
viewDrag.center = CGPoint(x: viewDrag.center.x + translation.x , y: viewDrag.center.y + translation.y)
sender.setTranslation(CGPoint.zero, in: self.view)
}
@objc func increase() {
slidermultiplier = CGFloat(slizer.value)
widthConstraints?.isActive = false
widthConstraints = viewDrag.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: slidermultiplier)
widthConstraints?.isActive = true
}
}
【问题讨论】:
-
您已经给了
viewDrag自动布局约束...但是在您的draggedView函数中,您明确设置了它的框架(使用viewDrag.center = CGPoint(...))。这不会改变它的约束,一旦你做其他事情来更新它,UIKit 就会根据它的约束重新定位/重新调整它的大小。
标签: swift initialization slider constraints nslayoutconstraint