2015年9月22日 星期二

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

iOS中,除了用UILabel的SizeToFit來測量文字長度外
NSString其實也有內建提供這個方法

以下是Objective-C的範例:
+ (CGSize)getSizeFromString:(NSString*)str withFont:(UIFont*)font{

    return [str sizeWithAttributes:@{

                                     NSFontAttributeName : font

                                     }];

}


這個method只要輸入NSString和UIFont,就可以得到String的尺吋(以CGSize回傳,有該String將要顯示的width或是height)

而Swift要測量的話,要先轉成NSString,且AttributteName也有所修改
如下
func getSizeFromString(string:String, withFont font:UIFont)->CGSize{

        let textSize = NSString(string: string ?? "").sizeWithAttributes(

            [ NSFontAttributeName:font ])

        return textSize

}


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

另外此方法UILabel的Size To Fit比較字串的長度其實是差不多的
如下範例(使用Swift為例):
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)



XCode輸出的結果如下:
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