【发布时间】:2017-07-04 11:42:30
【问题描述】:
我想在文本周围绘制一个可点击的气泡形状。为了做到这一点,我决定像这样向 UIButton 添加一个 shapelayer:
// Button also has this
bubbleButton.contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
bubbleButton.setTitle("Gutp", for: .normal)
// In my subclass of UIButton
override func layoutSubviews() {
super.layoutSubviews()
self.bubbleLayer?.removeFromSuperlayer()
let maskLayer = CAShapeLayer.init()
let bezierPath = UIBezierPath.init(roundedRect: self.bounds,
byRoundingCorners: [.topRight, .topLeft, .bottomLeft],
cornerRadii: CGSize(width: 20, height: 20))
maskLayer.path = bezierPath.cgPath
maskLayer.strokeColor = UIColor.red.cgColor
maskLayer.lineWidth = 2
maskLayer.fillColor = UIColor.clear.cgColor
maskLayer.backgroundColor = UIColor.clear.cgColor
maskLayer.isOpaque = false
self.bubbleLayer = maskLayer
if let layers = self.layer.sublayers {
self.layer.insertSublayer(self.bubbleLayer!, at: UInt32(layers.count))
} else {
self.layer.addSublayer(self.bubbleLayer!)
}
}
请不要看现在的表现。
我在 UIStackView 中添加了 2 个这样的按钮。
在某些文本情况下(通常是短的),我得到一个有趣的人工制品(如果可以说是尾巴),在文本较长的情况下得到一个正常的气泡:
我该如何解决这个问题?为什么我会出现这种行为?
编辑:在 bezierPathWithRoundedRect:byRoundingCorners:cornerRadii: 中链接有关损坏的cornerRadii 参数的其他可能相关问题。也许它会帮助有类似问题的人。
【问题讨论】:
-
会不会是你的按钮高度太低了?由于拐角半径为 20,因此需要至少为 40。但通常我不喜欢这些高级路径方法,我会使用直线和圆弧手动创建它。
-
@MaticOblak 是的,谢谢您的提示。
UIBezierPath.init(roundedRect似乎坏了。如果我检查我的半径不大于最小边的一半大小,它会按预期工作。如果你愿意,你可以写一个答案,这样我就可以接受了。
标签: ios swift uibutton uibezierpath