我正在构建一个扫描条形码的屏幕,我需要在其后面放一个半透明屏幕,UILabels
以提高对浅色背景的可见度.
这是屏幕现在的样子:
我正在设置背景颜色UILabel
以获得半透明的盒子.我还创建了一个自定义UILabel
子类,允许我UILabel
使用这种方法在文本的边缘和文本之间设置一些填充.
正如您在上面的屏幕中看到的UILabel
那样,未正确调整大小以将填充考虑在内."填充"只是将文本移动而不更改标签的宽度,导致文本截断.
这两个标签都包含任意长度的文本,我真的需要UILabel
动态调整大小.
我UILabel
可以覆盖哪种方法来增加标签的宽度和填充因子?
Nik*_*uhe 187
这是一个正确计算大小的标签类.该贴的代码是在斯威夫特3,但你也可以下载斯威夫特2或Objective-C的版本.
通过计算正确的textRect,所有sizeToFit
和自动布局的东西都按预期工作.诀窍是首先减去插入,然后计算原始标签边界,最后再添加插入.
class NRLabel : UILabel {
var textInsets = UIEdgeInsets.zero {
didSet { invalidateIntrinsicContentSize() }
}
override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
let insetRect = UIEdgeInsetsInsetRect(bounds, textInsets)
let textRect = super.textRect(forBounds: insetRect, limitedToNumberOfLines: numberOfLines)
let invertedInsets = UIEdgeInsets(top: -textInsets.top,
left: -textInsets.left,
bottom: -textInsets.bottom,
right: -textInsets.right)
return UIEdgeInsetsInsetRect(textRect, invertedInsets)
}
override func drawText(in rect: CGRect) {
super.drawText(in: UIEdgeInsetsInsetRect(rect, textInsets))
}
}
Run Code Online (Sandbox Code Playgroud)
如果要在故事板中设置文本插入,可以使用以下扩展来启用Interface Builder支持:
@IBDesignable
extension NRLabel {
// currently UIEdgeInsets is no supported IBDesignable type,
// so we have to fan it out here:
@IBInspectable
var leftTextInset: CGFloat {
set { textInsets.left = newValue }
get { return textInsets.left }
}
// Same for the right, top and bottom edges.
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以在IB中方便地设置插图,然后只需按⌘=调整标签的大小即可.
所有代码都在公共领域.随你做.
Kla*_*aas 14
这是一个UILabel子类的Swift版本(与@ Nikolai的答案相同),它在UILabel的文本周围创建了一个额外的填充:
class EdgeInsetLabel : UILabel {
var edgeInsets:UIEdgeInsets = UIEdgeInsetsZero
override func textRectForBounds(bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
var rect = super.textRectForBounds(UIEdgeInsetsInsetRect(bounds, edgeInsets), limitedToNumberOfLines: numberOfLines)
rect.origin.x -= edgeInsets.left
rect.origin.y -= edgeInsets.top
rect.size.width += (edgeInsets.left + edgeInsets.right);
rect.size.height += (edgeInsets.top + edgeInsets.bottom);
return rect
}
override func drawTextInRect(rect: CGRect) {
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, edgeInsets))
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18940 次 |
最近记录: |