Decrease the width of the last line in multiline UILabel

前端 未结 6 1907
谎友^
谎友^ 2020-12-04 18:19

I am implemententing a \"read more\" functionality much like the one in Apple\'s AppStore. However, I am using a multiline UILabel. Looking at Apple\'s AppStore

6条回答
  •  眼角桃花
    2020-12-04 19:03

    Ive just written a UILabel extension in Swift 4, using a binary search to speed up the substring calculation

    It was originally based on the solution by @paul-slm but has diverged considerably

    extension UILabel {
    
    func getTruncatingText(originalString: String, newEllipsis: String, maxLines: Int?) -> String {
    
        let maxLines = maxLines ?? self.numberOfLines
    
        guard maxLines > 0 else {
            return originalString
        }
    
        guard self.numberOfLinesNeeded(forString: originalString) > maxLines else {
            return originalString
        }
    
        var truncatedString = originalString
    
        var low = originalString.startIndex
        var high = originalString.endIndex
        // binary search substring
        while low != high {
            let mid = originalString.index(low, offsetBy: originalString.distance(from: low, to: high)/2)
            truncatedString = String(originalString[.. Int {
        let oneLineHeight = "A".size(withAttributes: [NSAttributedStringKey.font: font]).height
        let totalHeight = self.getHeight(forString: string)
        let needed = Int(totalHeight / oneLineHeight)
        return needed
    }
    
    private func getHeight(forString string: String) -> CGFloat {
        return string.boundingRect(
            with: CGSize(width: self.bounds.size.width, height: CGFloat.greatestFiniteMagnitude),
            options: [.usesLineFragmentOrigin, .usesFontLeading],
            attributes: [NSAttributedStringKey.font: font],
            context: nil).height
    }
    }
    

提交回复
热议问题