在视图中使用 textview 自动布局 [Swift]
Auto layout with textview inside views [Swift]
我正在尝试在主视图中创建两个视图,这些视图由 textView 自动调整大小,我想添加第一个视图,然后通过单击按钮添加秒数,但我遇到了一些错误。
但我不想对主视图设置等高约束,它必须根据其 2 个子视图中的文本视图调整大小
这是我的代码片段和我的意思的图像:
@objc func buttonAction() {
print("action")
mainView.addSubview(secondView)
firstView.topAnchor.constraint(equalTo: mainView.topAnchor).isActive = false
// I've tried to disable it to change the topAnchor of firstView
NSLayoutConstraint.activate([
secondView.bottomAnchor.constraint(equalTo: firstView.topAnchor),
secondView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
secondView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
secondView.topAnchor.constraint(equalTo: mainView.topAnchor)
])
}
func addConstraints() {
NSLayoutConstraint.activate([
firstView.topAnchor.constraint(equalTo: mainView.topAnchor),
firstView.bottomAnchor.constraint(equalTo: mainView.bottomAnchor),
firstView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
firstView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
])
NSLayoutConstraint.activate([
mainView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
mainView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
}
class View1: UIView { // the same as View2 class
lazy var textView: UITextView = {
let tv = UITextView()
tv.backgroundColor = .red
tv.isScrollEnabled = false
tv.font = UIFont(name: "Avenir", size: 16)
tv.text = "First"
tv.translatesAutoresizingMaskIntoConstraints = false
return tv
}()
init() {
super.init(frame: .zero)
setup()
}
required init?(coder: NSCoder) {
fatalError()
}
func setup() {
addSubview(textView)
textView.fillSuperview(padding: .init(top: 4, left: 4, bottom: 4, right: 4))
// fillSuperview() put 4 in top,left,right,bottom of superview
}
}
这是我的意思的图片:
您需要保存对 firstView 顶部约束的引用并停用该引用。您试图停用对 firstView 顶部约束的新引用。
class ViewController: UIViewController {
var firstViewTop: NSLayoutConstraint!
func addConstraints() {
firstViewTop = firstView.topAnchor.constraint(equalTo: mainView.topAnchor)
NSLayoutConstraint.activate([
firstViewTop,
firstView.bottomAnchor.constraint(equalTo: mainView.bottomAnchor),
firstView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
firstView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
])
NSLayoutConstraint.activate([
mainView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
mainView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
}
@objc func buttonAction() {
mainView.addSubview(secondView)
firstViewTop.isActive = false
NSLayoutConstraint.activate([
secondView.bottomAnchor.constraint(equalTo: firstView.topAnchor),
secondView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
secondView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
secondView.topAnchor.constraint(equalTo: mainView.topAnchor)
])
}
}
我正在尝试在主视图中创建两个视图,这些视图由 textView 自动调整大小,我想添加第一个视图,然后通过单击按钮添加秒数,但我遇到了一些错误。 但我不想对主视图设置等高约束,它必须根据其 2 个子视图中的文本视图调整大小 这是我的代码片段和我的意思的图像:
@objc func buttonAction() {
print("action")
mainView.addSubview(secondView)
firstView.topAnchor.constraint(equalTo: mainView.topAnchor).isActive = false
// I've tried to disable it to change the topAnchor of firstView
NSLayoutConstraint.activate([
secondView.bottomAnchor.constraint(equalTo: firstView.topAnchor),
secondView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
secondView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
secondView.topAnchor.constraint(equalTo: mainView.topAnchor)
])
}
func addConstraints() {
NSLayoutConstraint.activate([
firstView.topAnchor.constraint(equalTo: mainView.topAnchor),
firstView.bottomAnchor.constraint(equalTo: mainView.bottomAnchor),
firstView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
firstView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
])
NSLayoutConstraint.activate([
mainView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
mainView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
}
class View1: UIView { // the same as View2 class
lazy var textView: UITextView = {
let tv = UITextView()
tv.backgroundColor = .red
tv.isScrollEnabled = false
tv.font = UIFont(name: "Avenir", size: 16)
tv.text = "First"
tv.translatesAutoresizingMaskIntoConstraints = false
return tv
}()
init() {
super.init(frame: .zero)
setup()
}
required init?(coder: NSCoder) {
fatalError()
}
func setup() {
addSubview(textView)
textView.fillSuperview(padding: .init(top: 4, left: 4, bottom: 4, right: 4))
// fillSuperview() put 4 in top,left,right,bottom of superview
}
}
这是我的意思的图片:
您需要保存对 firstView 顶部约束的引用并停用该引用。您试图停用对 firstView 顶部约束的新引用。
class ViewController: UIViewController {
var firstViewTop: NSLayoutConstraint!
func addConstraints() {
firstViewTop = firstView.topAnchor.constraint(equalTo: mainView.topAnchor)
NSLayoutConstraint.activate([
firstViewTop,
firstView.bottomAnchor.constraint(equalTo: mainView.bottomAnchor),
firstView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
firstView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
])
NSLayoutConstraint.activate([
mainView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
mainView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
}
@objc func buttonAction() {
mainView.addSubview(secondView)
firstViewTop.isActive = false
NSLayoutConstraint.activate([
secondView.bottomAnchor.constraint(equalTo: firstView.topAnchor),
secondView.leadingAnchor.constraint(equalTo: mainView.leadingAnchor),
secondView.trailingAnchor.constraint(equalTo: mainView.trailingAnchor),
secondView.topAnchor.constraint(equalTo: mainView.topAnchor)
])
}
}