【发布时间】:2023-04-27 21:14:01
【问题描述】:
如何制作从中心开始绘制并向左右扩展的 UIBezierPath?
我当前的解决方案不是使用 UIBezierPath,而是使用另一个 UIView 中的 UIView。子视图位于其父视图的中心,当我需要扩展子视图时,我会调整子视图的宽度。然而,这个解决方案远非完美,因为视图位于 UIStackView 内部,而堆栈视图位于 UICollectionView 单元格中,有时无法正确获取宽度。
override func layoutSubviews() {
super.layoutSubviews()
progressView.cornerRadius = cornerRadius
clipsToBounds = true
addSubview(progressView)
NSLayoutConstraint.activate([
progressView.topAnchor.constraint(equalTo: topAnchor),
progressView.bottomAnchor.constraint(equalTo: bottomAnchor),
progressView.centerXAnchor.constraint(equalTo: centerXAnchor)
])
let width = frame.width
let finalProgress = CGFloat(progress) * width
let widthConstraint = progressView.widthAnchor.constraint(equalToConstant: finalProgress)
widthConstraint.priority = UILayoutPriority(rawValue: 999)
widthConstraint.isActive = true
}
进度是 double 类型的类属性,当它被设置时,我调用 layoutIfNeeded。
我也尝试调用 setNeedsLayout 和 layoutIfNeeded 但它不能解决问题。 SetNeedsDisplay 和 invalidateIntrinzicSize 也不起作用。
现在,我想使用贝塞尔路径,但问题是它从给定点开始并从左到右绘制。问题是:如何制作居中的 UIBezierPath 以及当我增加宽度时它会扩展(保持在中心)
【问题讨论】:
-
尽管如此,我会这样做的方式正是您一开始所说的那样,一种以自己的宽度绘制水平形状的视图。
-
问题是滚动几次后,它会停止更新,或者由于某种原因获取不正确,因为它不会每次都调用 layoutSubviews。我尝试强制 layoutSubviews 但它不起作用。
-
那将是您未在问题中透露的其他原因。 “滚动几次后”表明您没有考虑单元重用。但是很难说,因为你没有展示相关代码。
标签: ios swift uibezierpath cashapelayer