» 首頁 » 討論區 » iOS程式討論 »iOS 測量文字長度, 以Swift和Objective-C為例

iOS 測量文字長度, 以Swift和Objective-C為例

發表人: Seachaos
積分: 2432
發表時間: 2015-09-22 01:30:37
iOS中,除了用UILabel的SizeToFit來測量文字長度外
NSString其實也有內建提供這個方法

以下是Objective-C的範例:
[sea:javaCode]
+ (CGSize)getSizeFromString:(NSString*)str withFont:(UIFont*)font{
return [str sizeWithAttributes:@{
NSFontAttributeName : font
}];
}
[/sea]
這個method只要輸入NSString和UIFont,就可以得到String的尺吋(以CGSize回傳,有該String將要顯示的width或是height)

而Swift要測量的話,要先轉成NSString,且AttributteName也有所修改
如下
[sea:javaCode]
func getSizeFromString(string:String, withFont font:UIFont)->CGSize{
let textSize = NSString(string: string ?? "").sizeWithAttributes(
[ NSFontAttributeName:font ])
return textSize
}
[/sea]

應用上來說可以
var textSize = getSizeFromString(label.text! , withFont: label.font)
然後從 textSize.width 測量出即將顯示的文字長度
這在一些UI的編排或是計算上是滿有用的

另外此方法UILabel的Size To Fit比較字串的長度其實是差不多的
如下範例(使用Swift為例):
[sea:javaCode]
label.backgroundColor = UIColor.lightGrayColor()
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByClipping
label.text = "中文中文56789 a123456789 a123456789 a123456789"
label.frame = CGRectMake(20, 20, 2000, 200)

label.sizeToFit()


// 使用和label相同的文字(text)和字體(font) 給swift的範例
var textSize = getSizeFromString(label.text! , withFont: label.font)
NSLog("here is swift string width:%f", textSize.width)
// 這是 ObjC的測量文字範例 (get text length or width )
textSize = OBJCViewController.getSizeFromString(label.text!, withFont: label.font)
NSLog("here is objc string width:%f", textSize.width)
NSLog("here is label width:%f", label.frame.size.width)
[/sea]

XCode的輸出結果如下:
[sea:javaCode]
2015-09-22 01:23:46.728 test20150922[2432:48542] here is swift string width:423.007812
2015-09-22 01:23:46.729 test20150922[2432:48542] here is objc string width:423.007812
2015-09-22 01:23:46.729 test20150922[2432:48542] here is label width:423.500000
[/sea]