【发布时间】:2020-07-29 05:57:37
【问题描述】:
我应该达到以下结果:
如您所见,它包含平行四边形(不是矩形)列表,其中包含标签。此外,它可以是动态的,这意味着我可以使用 stackview。首先,让我们画出类似平行四边形的视图:
class ParallelogramView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .clear
}
override func draw(_ rect: CGRect) {
super.draw(rect)
let path = UIBezierPath()
/// let's start from this point
path.move(to: CGPoint(x: 8, y: 0))
/// drawing horizontal top line till we can
path.addLine(to: CGPoint(x: rect.maxX, y: 0))
/// drawing to bottom but little bit to left
path.addLine(to: CGPoint(x: rect.maxX - 16, y: rect.maxY))
/// drawing from right to left
path.addLine(to: CGPoint(x: 0, y: rect.maxY))
/// connecting all
path.close()
/// just for sample filling it with some color. I don't know how to change it later :(
UIColor.red.setFill()
path.fill()
}
}
所有代码都有注释。之后,让我们定义一个LabelView,其中包含我们的平行四边形,其中包含标签。
class LabelView: UIView {
/// out text
lazy var label: UILabel = {
let label = UILabel()
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
/// our parallelogramView
lazy var plView: ParallelogramView = {
let trView = ParallelogramView()
trView.translatesAutoresizingMaskIntoConstraints = false
return trView
}()
override init(frame: CGRect) {
super.init(frame: frame)
/// adding label to paralleogram
plView.addSubview(label)
addSubview(plView)
NSLayoutConstraint.activate([
plView.leadingAnchor.constraint(equalTo: leadingAnchor),
plView.trailingAnchor.constraint(equalTo: trailingAnchor),
plView.bottomAnchor.constraint(equalTo: bottomAnchor),
plView.topAnchor.constraint(equalTo: topAnchor),
label.leadingAnchor.constraint(equalTo: plView.leadingAnchor, constant: 16),
label.trailingAnchor.constraint(equalTo: plView.trailingAnchor, constant: -16),
label.bottomAnchor.constraint(equalTo: plView.bottomAnchor),
label.topAnchor.constraint(equalTo: plView.topAnchor)
])
}
}
好的。我们的观点已经准备好了。现在,我们应该使用对齐填充将其添加到水平堆栈视图中。
for item in ["Text", "Text", "Text"] {
let labelView = LabelView()
labelView.label.text = item
stackView.addArrangedSubview(labelView)
}
这是我们得到的结果。
这不是想要的结果,因为它有理性的问题。据我了解,iOS中每个视图的框架都是矩形的,不能更改。即使我的 stackview 的间距是 0,我仍然有一种间距(实际上没有),因为无论如何视图都是矩形的。那么,如何实现截图中的结果呢?我做错了什么?
【问题讨论】:
标签: ios drawing polygon uibezierpath cashapelayer