我在螢屏上畫了一條線來錨定到 FSCalendar 的底部,沒有什么特別的,但是這條線出現在不同設備上的不同位置(嘗試使用物理 iPhone 11 Pro 和幾個不同的模擬器。如果我把它放在正確的位置在一個設備上,它會在另一個設備上顯得有點高或低。關于為什么會發生這種情況的任何想法?
我的代碼如下(前導和尾隨位置渲染良好)...
extension UIView {
let bottom: CGFloat {
return self.frame.size.height self.frame.origin.y
}
let leading: CGFloat {
return self.frame.origin.x
}
let trailing: CGFloat {
return self.frame.size.width self.frame.origin.x
}
}
class CalendarViewController: UIViewController {
@IBOutlet var calendar: FSCalendar!
override func viewDidLoad() {
drawCalendarSeperatorLine()
}
private func drawCalendarSeperatorLine() {
let path = UIBezierPath()
let yPosition: CGFloat = calendar.bottom
let xLeading = view.leading 15
let xTrailing = view.trailing - 15
path.move(to: CGPoint(x: xLeading, y: yPosition))
path.addLine(to: CGPoint(x: xTrailing, y: yPosition))
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.separator.cgColor
shapeLayer.lineWidth = 1
shapeLayer.opacity = 0.7
view.layer.addSublayer(shapeLayer)
}
}
uj5u.com熱心網友回復:
框架沒有完全布局在viewDidLoad().
您可以將您的電話移至viewDidLayoutSubviews():
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
drawCalendarSeperatorLine()
}
但是,viewDidLayoutSubviews()可以并且經常會被多次呼叫(例如在設備旋轉時),并且您的 func 每次都會添加一個新的子層。
另一種(可能更好的方法)是添加一個 1 pt 高的視圖,限制在calendarView.
所以,viewDidLoad()你可以這樣做:
override func viewDidLoad() {
super.viewDidLoad()
let sepView = UIView()
sepView.backgroundColor = UIColor.separator.withAlphaComponent(0.7)
sepView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(sepView)
NSLayoutConstraint.activate([
sepView.leadingAnchor.constraint(equalTo: calendar.leadingAnchor, constant: 15.0),
sepView.trailingAnchor.constraint(equalTo: calendar.trailingAnchor, constant: -15.0),
sepView.topAnchor.constraint(equalTo: calendar.bottomAnchor),
sepView.heightAnchor.constraint(equalToConstant: 1.0),
])
}
現在你將在日歷視圖的底部有你的“分隔線”,如果/當日歷視圖框架發生變化,它將“粘”到底部并調整其寬度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/435125.html
標籤:迅速 代码 uibezierpath 斯卡伦达
