我正确设置了自动布局,并且可以正常工作。但是,当我在横向使用自定义UITextField类时,边框不会更改。我使用以下代码:
required init?(coder aDecoder: (NSCoder!)) {
super.init(coder: aDecoder)
self.delegate=self;
border.borderColor = UIColor(netHex: 0xc6c6c6).cgColor
border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height)
border.borderWidth = width
self.layer.addSublayer(border)
self.layer.masksToBounds = true
//self.font = UIFont(name: "System", size: CGFloat(23))
}
override func draw(_ rect: CGRect) {
border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height)
}
override func awakeFromNib() {
super.awakeFromNib()
border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height)
}
更改方向时,如何更改自定义边框大小。
答案 0 :(得分:0)
我的应用程序需要在方向更改时更改约束。虽然可以使用大小类和特征集合,但我的需求超出了这个范围。
大小类在大多数时候都能很好地工作,堆栈控件也能很好地工作,但是我需要尽可能地最大化GLKView,从而将4个滑块从底部(纵向)移动到右侧(在横向中)。如果您使用尺寸类和代码编写通用应用程序,您将很快了解到iPad的“正常”尺寸,无论其方向如何。
以下是我对此应用进行编码以检查其定位的方式。
首先,我扩展了UIView:
extension UIView {
public func orientationHasChanged(_ isInPortrait:inout Bool) -> Bool {
if self.frame.width > self.frame.height {
if isInPortrait {
isInPortrait = false
return true
}
} else {
if !isInPortrait {
isInPortrait = true
return true
}
}
return false
}
}
在我的视图控制器中,我有以下内容:
var initialOrientation = true
var isInPortrait = false
override func viewWillLayoutSubviews() {
super.viewDidLayoutSubviews()
if initialOrientation {
initialOrientation = false
if view.frame.width > view.frame.height {
isInPortrait = false
} else {
isInPortrait = true
}
} else {
if view.orientationHasChanged(&isInPortrait) {
// place your orientation change code here - isInPortrait will indicate which orientation the device is in
}
}
}
我发现viewWillLayoutSubviews()对我来说是最好的选择,因为它最初是打的,每次方向都会改变。还有其他地方 - viewDidLayoutSubviews()和viewWillTransistionTo(size :)特别是 - 但WWDC谈论使应用程序自适应第2部分也使用了它。此外,您现在拥有所需的所有视图尺寸!
要记住的关键是,在应用启动和/或方向更改期间,viewWIllLayoutSubviews()可能会被调用几次,因此您需要为其编码。制作两个Bool变量可以解决这个问题,而你的代码只运行一次。