Swift中常用Extension(二)

1,017 阅读2分钟

String

1、根据高度和字体大小获取文本宽度

public extension String {
    func width(fontSize: UIFont, height: CGFloat = 20) -> CGFloat {
        let rect = NSString(string: self).boundingRect(with: CGSize(width: CGFloat(MAXFLOAT), height: height), options: .usesLineFragmentOrigin, attributes: [.font: fontSize], context: nil)
        return ceil(rect.width)
    }
} 

2、根据宽度和字体大小获取文本高度

public extension String {
    func height(fontSize: UIFont, width: CGFloat) -> CGFloat {
        let rect = NSString(string: self).boundingRect(with: CGSize(width: width, height: CGFloat.greatestFiniteMagnitude), options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [.font: fontSize], context: nil)
        return ceil(rect.height)
    }
}

3、根据宽度、字体大小和行间距获取文本高度

有时候我们给UILabel设置了行间距,这时用上面的方法获取高度就不对了,我们可以设置open func boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedString.Key : Any]? = nil, context: NSStringDrawingContext?) -> CGRect这个方法里面的attributes来设置行高。它的keyNSAttributedString.Key.paragraphStyle,然后设置NSMutableParagraphStylelineSpacing就行了

public extension String {
    func height(fontSize: UIFont, width: CGFloat, lineSpac: CGFloat = 0) -> CGFloat {
        let font = fontSize
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpac
        let rect = NSString(string: self).boundingRect(with: CGSize(width: width, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [.font: font, .paragraphStyle: paragraphStyle], context: nil)
        return ceil(rect.height)
    }
}

4、根据URL获取视频的第一帧图片

在做项目的时候,后台返回了一个视频的URL,但是我们一开始不需要播放,所有就需要根据视频的URL来获取第一帧图片

public extension String {
    var getVideoFirstFrame: UIImage? {
        guard let videoUrl = URL(string: self) else { return nil }
        let asset = AVURLAsset(url: videoUrl, options: nil)
        let assetGen = AVAssetImageGenerator(asset: asset)
        assetGen.appliesPreferredTrackTransform = true
        let time = CMTimeMakeWithSeconds(0.0, preferredTimescale: 1)
        do {
            let image = try assetGen.copyCGImage(at: time, actualTime: nil)
            return UIImage(cgImage: image)
        } catch {
            return nil
        }
    }
}

Dictionary

往一个Dictionary添加里面添加列一个Dictionary

1、正常情况下,Dictionary只能一个一个往里面添加,如果在一个Dictionary添加另一个Dictionary的话就需要自己加一个append的方法
2、因为Dictionary是值类型,想要修改里面的属性变量就需要在方法名前面加上mutating关键字

public extension Dictionary {
    mutating func append(_ dict: Dictionary) {
        dict.forEach { (key, value) in
            self.updateValue(value, forKey: key)
        }
    }
}

UILabel

UILabel设置行高

public extension UILabel {
    func line(_ spacing: CGFloat) {
        guard let text = text else { return }
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = spacing
        paragraphStyle.lineBreakMode = lineBreakMode
        paragraphStyle.alignment = textAlignment
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: text.count))
        attributedText = attributedString
    }
}