我有一个在swift中以编程方式创建的UITextView,这是我在我的viewDidLoad()中为我的控制器所拥有的。
let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
if isPortrait {
searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7).isActive = true
} else {
searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.1).isActive = true
}
这是searchTextView的设置方式
func setupView() {
self.layer.cornerRadius = 8.0
self.translatesAutoresizingMaskIntoConstraints = false
self.textContainerInset = UIEdgeInsets(top: 12, left: 10, bottom: 0, right: 10)
self.textContainer.maximumNumberOfLines = 1
self.textContainer.lineBreakMode = .byTruncatingHead
self.autocorrectionType = .no
self.text = ""
self.font = Constants.fonts().largeFont
self.backgroundColor = UIColor.white
self.adjustsFontForContentSizeCategory = true
self.textColor = UIColor.black
self.layer.borderColor = UIColor.gray.cgColor
self.layer.borderWidth = 0.25
// Need clipsToBounds = false to show shadow
self.clipsToBounds = false
self.layer.shadowRadius = 20.0
self.layer.shadowColor = UIColor.gray.cgColor
self.layer.shadowOffset = CGSize(width: 2.0, height: 2.0)
self.layer.shadowOpacity = 0.5
self.tintColor = Constants.colors().primaryLightColor
}
这为searchTextView提供了一个基于设备方向的不同widthAnchor。这很好,但是,稍后我会检查设备方向何时更改并删除并添加相应的widthAnchors。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
sideMenuLauncher.dismissSideMenu(duration: 0)
let toPortraitMode = self.view.frame.size.width > size.width
searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7).isActive = toPortraitMode
searchTextView.widthAnchor.constraint(equalToConstant: size.width * 0.1).isActive = !toPortraitMode
for constraint in view.constraints {
print("\(constraint)\n")
}
searchTextView.updateConstraints()
searchTextView.layoutIfNeeded()
}
但是这实际上并没有停用任何约束,正如它在这个控制台输出中所说的那样:
(
"<NSLayoutConstraint:0x60c000896170 PickupApp.SearchBarView:0x7f7ee1016a00.width == 56.8 (active)>",
"<NSLayoutConstraint:0x604000c9c6b0 PickupApp.SearchBarView:0x7f7ee1016a00.width == 397.6 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x604000c9c6b0 PickupApp.SearchBarView:0x7f7ee1016a00.width == 397.6 (active)>
我无法弄清楚为什么即使添加了约束也没有停用这些约束。
答案 0 :(得分:0)
u32_result
答案 1 :(得分:0)
您需要存储该约束,以便稍后停用它。
使用全局变量来存储约束。
var cons:NSLayoutConstraint?
按如下所示更改viewDidLoad()以便稍后访问相同的约束:
override func viewDidLoad() {
super.viewDidLoad()
let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
if isPortrait {
self.cons = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7)
} else {
self.cons = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.1)
}
self.cons?.isActive = true
}
答案 2 :(得分:0)
我希望以下代码能为您提供帮助,
1)声明全局变量
var searchTextViewPortraitWidthConstraint: NSLayoutConstraint?
var searchTextViewLandscapeWidthConstraint: NSLayoutConstraint?
let searchTextView = UITextView()
2) viewDidLoad()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
setupSearchTextView()
let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
if isPortrait {
searchTextViewPortraitWidthConstraint = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7)
searchTextViewLandscapeWidthConstraint = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.1)
searchTextViewPortraitWidthConstraint?.isActive = true
} else {
searchTextViewLandscapeWidthConstraint = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.1)
searchTextViewPortraitWidthConstraint = searchTextView.widthAnchor.constraint(equalToConstant: view.frame.width * 0.7)
searchTextViewLandscapeWidthConstraint?.isActive = true
}
}
配置textview
func setupSearchTextView(){
searchTextView.frame = CGRect(x: <#T##CGFloat#>, y: <#T##CGFloat#>, width: <#T##CGFloat#>, height: <#T##CGFloat#>)
/*
.
.
.
.
.
.*/
}
3)根据设备方向激活或停用宽度约束使用以下任一方法(即viewWillLayoutSubviews()
或viewDidLayoutSubviews()
)。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
if isPortrait{
searchTextViewPortraitWidthConstraint?.isActive = true
searchTextViewLandscapeWidthConstraint?.isActive = false
}else{
searchTextViewPortraitWidthConstraint?.isActive = false
searchTextViewLandscapeWidthConstraint?.isActive = true
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let isPortrait = UIInterfaceOrientationIsPortrait(UIApplication.shared.statusBarOrientation)
if isPortrait{
searchTextViewPortraitWidthConstraint?.isActive = true
searchTextViewLandscapeWidthConstraint?.isActive = false
}else{
searchTextViewPortraitWidthConstraint?.isActive = false
searchTextViewLandscapeWidthConstraint?.isActive = true
}
}