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 的内存,