はつねむさんぽのパンくずたち

エンジニアになる人生で通った道のあしあと

【Swift】もっと読む機能【UILabel】

やりたいこと

「もっと読む」機能を実現するために、UILabelがtruncate(切り捨て)されているか否かを判断したい。 調べてみても、改行対応かつUITableViewCell内でも正確に計算できるものがなかったので。

実装方法

linesはUILabelに指定した行数。 その行数を超える時にtruncateされるので、truncateされなかった場合の高さ(textSize.height)と、最大の高さ(maxHeight)を比較する。

extension UILabel {
    func isTruncated(lines: Int, width: CGFloat) -> Bool {
        guard let labelText = text else { return false }
        let maxHeight = font.lineHeight * CGFloat(lines)
        let textSize = (labelText as NSString).boundingRect(
            with: CGSize(width: width,
            height: .greatestFiniteMagnitude),
            options: .usesLineFragmentOrigin,
            attributes: [.font: font], 
            context: nil
        ).size
        return textSize.height > maxHeight
    }
}