开发时,经常出现Label需要文字缩进的情况。
比如一个label需要圆角,文字居中,带颜色的背景,左右两边需要留出距离,这样出来的效果才好看。如下图
EdgeInsetLabel,可以轻松实现文字缩进的效果。并且支持在storyboard和xib中直接配置,直接显示出最终效果。
//
// EdgeInsetLabel.swift
//
// Created by pilgrim on 2017/4/27.
//
import UIKit
/// - 版本
/// - V1.0.0 -- 2017-8-7 -- 创建代码
/// - V1.0.1 -- 2018-3-6 -- 优化代码注释,支持jazzy自动生成文档
/// - V1.0.2 -- 2021-3-4 -- 可视化支持,textInsets可以在storyboard和xib中配置。
/// - 功能说明
/// - 支持文字缩进的Label
@IBDesignable public class EdgeInsetLabel: UILabel {
// MARK: - 成员变量
/// 文字缩进配置项
public var textInsets: UIEdgeInsets = UIEdgeInsets.zero
/// 上侧 缩进
@IBInspectable private var topInset: CGFloat {
set {
textInsets.top = newValue
}
get {
return textInsets.top
}
}
/// 左侧 缩进
@IBInspectable private var leftInset: CGFloat {
set {
textInsets.left = newValue
}
get {
return textInsets.left
}
}
/// 下侧 缩进
@IBInspectable private var bottomInset: CGFloat {
set {
textInsets.bottom = newValue
}
get {
return textInsets.bottom
}
}
/// 右侧 缩进
@IBInspectable private var rightInset: CGFloat {
set {
textInsets.right = newValue
}
get {
return textInsets.right
}
}
// MARK: - Public Functions
/// 重写的系统方法,请勿调用
override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
var rect = super.textRect(forBounds: bounds.inset(by: textInsets), limitedToNumberOfLines: numberOfLines)
rect.origin.x -= textInsets.left
rect.origin.y -= textInsets.top
rect.size.width += textInsets.left + textInsets.right
rect.size.height += textInsets.top + textInsets.bottom
return rect
}
/// 重写的系统方法,请勿调用
override public func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: textInsets))
}
}
纯代码的使用方式很简单,生成EdgeInsetLabel,然后设置label.textInsets即可。示例如下
/// 标题
private lazy var titleLabel: EdgeInsetLabel = {
let label = EdgeInsetLabel()
label.textColor = .black
label.font = UIFont.systemFont(ofSize: 12, weight: .medium)
label.textInsets = UIEdgeInsets(top: 0, left: 9.0, bottom: 0, right: 9.0)
return label
}()
如果需要在xib或storyboard中配置,示例如下:
轻松搞定!配置缩进时,xib和storyboard中展示的视图也会实时更新哦!