2014-10-08 40 views
0

我做了一個customizd attributed label,它適用於字母或數字字符。但是,將文本更改爲包含中文(或日文,韓文等)字符的文本將無法工作。 例如 我已經初始化了attributed label,並設置有enter code hereCustomizd歸屬標籤中的漢字問題

NSString *duesStr = @"150.00 元"; 
[attrLabel setText:duesStr]; 
[attrLabel setFont:[UIFont boldSystemFontOfSize:17] fromIndex:0 length:duesStr.length]; 
[attrLabel setColor:[UIColor redColor] fromIndex:0 length:6]; 
[attrLabel setColor:[UIColor blueColor] fromIndex:7 length:2]; 
[self.view addSubview:attrLabel]; 

文本,並在viewDidAppear:我想文字更改爲另一個字符串

// if the text going to change contains some chinese characters it will not work. 
[attrLabel setText:@"222.00 元"]; 
[attrLabel setFont:[UIFont boldSystemFontOfSize:17] fromIndex:0 length:attrLabel.text.length]; 
[attrLabel setColor:[UIColor blueColor] fromIndex:0 length:10]; 
[attrLabel setColor:[UIColor redColor] fromIndex:0 length:6]; 

attributed label文本不會直到您刪除@「222.00元」中的字元。

請下來加載整個項目herehttps://github.com/bohanyzu/AttributedLabelTest.git

感謝。

+0

使用'UILabel'有什麼問題? – borrrden 2014-10-08 09:34:59

+0

與iOS 6,方法setAttribute不可用。 – bohan 2014-10-08 10:12:09

+0

你的意思是'setAttributedText'? – borrrden 2014-10-08 10:16:56

回答

0

在drawRect方法,請更改以下行:

for (int i = 0; i < [self.layer.sublayers count]; i++) { 
    CALayer *curLayer = [self.layer.sublayers objectAtIndex:i]; 
    curLayer.hidden = YES; 
    [curLayer removeFromSuperlayer]; 
} 

爲以下:

for (CALayer *subLayer in self.layer.sublayers) { 
    if ([subLayer isKindOfClass:[CATextLayer class]]) { 
     [subLayer removeFromSuperlayer]; 
    } 
} 

的原因在於原始代碼中刪除的UILabel的所有子層,其包括UILabelContentLayer ,當你更新文本時,drawRect不會被再次調用,因爲UILabel只有一個CATextLayer。

/* The text layer provides simple text layout and rendering of plain 
* or attributed strings. The first line is aligned to the top of the 
* layer. */ 

正如文件中提到,CATextLayer提供簡單的文字佈局,中國文字是複雜的,所以讓UILabel的默認層做的工作。

當您將其設置爲英文文本時,drawRect方法將被調用兩次。但是如果有中文字符,drawRect只會被調用一次,這就是新文本沒有顯示的原因。更改代碼後,drawRect將被調用兩次,從而更新文本。

+0

非常感謝,它的工作原理。 – bohan 2014-10-08 15:41:52