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来设置行高。它的key是NSAttributedString.Key.paragraphStyle,然后设置NSMutableParagraphStyle的lineSpacing就行了
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
}
}