draw(_ rect: CGRect) 在不同 iOS 版本上的失真
draw(_ rect: CGRect) distortion on different iOS versions
我正在做一个 searchBar 研究,但我发现 iOS 的不同版本的布局有些扭曲,我不记得也不知道 [=] 之间有什么相关的变化18=]能做到这一点,我有点迷茫。
override public func draw(_ rect: CGRect) {
drawPosition()
}
iOS 15
iOS 12.4
private lazy var widthLeftView: CGFloat = 0.0
private func drawPosition() {
searchView.addSubview(searchIcon)
widthConstraint = searchView.widthAnchor.constraint(equalToConstant: calculateWidthLeftView())
NSLayoutConstraint.activate([
searchView.heightAnchor.constraint(equalToConstant: searchViewSize),
widthConstraint,
searchIcon.heightAnchor.constraint(equalToConstant: searchIconSize),
searchIcon.widthAnchor.constraint(equalToConstant: searchIconSize),
searchIcon.centerYAnchor.constraint(equalTo: searchView.centerYAnchor),
searchIcon.trailingAnchor.constraint(
equalTo: searchView.trailingAnchor,
constant: 0)
])
searchBarTextField.leftView = searchView
searchBarTextField.leftViewMode = .always
}
private func calculateWidthLeftView() -> Double {
self.layoutIfNeeded()
let widht = self.frame.size.width - 54
let widhLeft = widht / 2
return widhLeft
}
通过删除覆盖 draw() 函数并将其放在覆盖布局子视图中调用来解决问题
public override func layoutSubviews() {
super.layoutSubviews()
drawPosition()
}
这个决定有两个原因,首先它修复了错误,其次,我发现覆盖 draw() 会影响性能并逐渐填满 iPhone 的内存,
我正在做一个 searchBar 研究,但我发现 iOS 的不同版本的布局有些扭曲,我不记得也不知道 [=] 之间有什么相关的变化18=]能做到这一点,我有点迷茫。
override public func draw(_ rect: CGRect) {
drawPosition()
}
iOS 15
iOS 12.4
private lazy var widthLeftView: CGFloat = 0.0
private func drawPosition() {
searchView.addSubview(searchIcon)
widthConstraint = searchView.widthAnchor.constraint(equalToConstant: calculateWidthLeftView())
NSLayoutConstraint.activate([
searchView.heightAnchor.constraint(equalToConstant: searchViewSize),
widthConstraint,
searchIcon.heightAnchor.constraint(equalToConstant: searchIconSize),
searchIcon.widthAnchor.constraint(equalToConstant: searchIconSize),
searchIcon.centerYAnchor.constraint(equalTo: searchView.centerYAnchor),
searchIcon.trailingAnchor.constraint(
equalTo: searchView.trailingAnchor,
constant: 0)
])
searchBarTextField.leftView = searchView
searchBarTextField.leftViewMode = .always
}
private func calculateWidthLeftView() -> Double {
self.layoutIfNeeded()
let widht = self.frame.size.width - 54
let widhLeft = widht / 2
return widhLeft
}
通过删除覆盖 draw() 函数并将其放在覆盖布局子视图中调用来解决问题
public override func layoutSubviews() {
super.layoutSubviews()
drawPosition()
}
这个决定有两个原因,首先它修复了错误,其次,我发现覆盖 draw() 会影响性能并逐渐填满 iPhone 的内存,