swift - 使用滑块更改 NSLAYOUT 约束图像视图的宽度和高度
问题描述
我 swift 的代码目标是使用滑块来增加减小图像视图的大小。imageview pic 应该能够根据滑动滑块的值增加减小的大小。当调用函数时,必须取消激活原始约束,以便可以更改宽度和高度。我听说可以使用动画块。
import UIKit
class ViewController: UIViewController {
var pic = UIImageView()
var slide = UISlider()
var currentView: UIView?
var oldCons = [NSLayoutConstraint]()
override func viewDidLoad() {
super.viewDidLoad()
slide.backgroundColor = .systemPink
pic.backgroundColor = .systemGreen
[pic,slide].forEach {
$0.translatesAutoresizingMaskIntoConstraints = false
view.addSubview($0)
}
NSLayoutConstraint.activate([
slide.heightAnchor.constraint(equalTo: view.heightAnchor ,multiplier: 0.25),
slide.widthAnchor.constraint(equalTo: view.widthAnchor ,multiplier: 0.25),
slide.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0),
slide.topAnchor.constraint(equalTo: pic.bottomAnchor, constant :0),
])
oldCons = [
pic.topAnchor.constraint(equalTo: view.topAnchor, constant :0),
pic.heightAnchor.constraint(equalTo: view.heightAnchor ,multiplier: 0.25),
pic.widthAnchor.constraint(equalTo: view.widthAnchor ,multiplier: 0.25),
pic.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0),
]
NSLayoutConstraint.activate(oldCons)
slide.addTarget(self, action: #selector(change), for: .allTouchEvents)
}
@objc func change(){
NSLayoutConstraint.deactivate(oldCons)
pic.bounds.size.width = CGFloat(slide.value)
pic.bounds.size.height = CGFloat(slide.value)
}
}
解决方案
您无需停用约束。您只需要保存它们并在滑块滑动时更新常量。
class ViewController: UIViewController {
var pic = UIImageView()
var slide = UISlider()
var currentView: UIView?
var picWidth: NSLayoutConstraint!
var picHeight: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
// ...
picWidth = pic.widthAnchor.constraint(equalTo: view.widthAnchor ,multiplier: 0.25)
picHeight = pic.heightAnchor.constraint(equalTo: view.heightAnchor ,multiplier: 0.25)
NSLayoutConstraint.activate([
slide.heightAnchor.constraint(equalTo: view.heightAnchor ,multiplier: 0.25),
slide.widthAnchor.constraint(equalTo: view.widthAnchor ,multiplier: 0.25),
slide.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0),
slide.topAnchor.constraint(equalTo: pic.bottomAnchor, constant :0),
pic.topAnchor.constraint(equalTo: view.topAnchor, constant :0),
picWidth,
picHeight,
pic.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant :0),
])
// ...
}
@objc func change(){
picWidth.constant = CGFloat(slide.value) * view.frame.size.width * 0.25
picHeight.constant = CGFloat(slide.value) * view.frame.size.height * 0.25
}
}
推荐阅读
- c++ - c++17 和 Visual Studio 2017 的模块错误
- python - 如何通过使用 python 提供视频链接来检查目录中是否存在 YouTube 视频?
- c++ - 是否可以通过 MFC 扩展 dll 加载常用控件
- c++ - 我得到的输出是 0112,我期望得到的输出是 2
- python - 三列ABC,cumsum小于10取A*B取A*C
- flutter - Flutter android studio vscode 终端自动打开和关闭
- amazon-athena - 使用未来 presto 版本的功能
- php - DOM Pdf 在 codeigniter 框架中不起作用
- r - 在 R 中大小不等的多个 data.frame 对象中查找最新日期
- android - Android OS 语言查找:让 OS 知道应用的默认语言是什么