답변:
이를 수행하는 방법은 다음 NSAttributedString
과 같이 사용하는 것입니다.
NSMutableAttributedString *text =
[[NSMutableAttributedString alloc]
initWithAttributedString: label.attributedText];
[text addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(10, 1)];
[label setAttributedText: text];
나는 UILabel
그것을하기 위해 확장을 만들었다 .
나는 category
for 를 만들어서 이것을 했다.NSMutableAttributedString
-(void)setColorForText:(NSString*) textToFind withColor:(UIColor*) color
{
NSRange range = [self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
[self addAttribute:NSForegroundColorAttributeName value:color range:range];
}
}
그것을 사용하십시오
- (void) setColoredLabel
{
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Here is a red blue and green text"];
[string setColorForText:@"red" withColor:[UIColor redColor]];
[string setColorForText:@"blue" withColor:[UIColor blueColor]];
[string setColorForText:@"green" withColor:[UIColor greenColor]];
mylabel.attributedText = string;
}
SWIFT 3
extension NSMutableAttributedString{
func setColorForText(_ textToFind: String, with color: UIColor) {
let range = self.mutableString.range(of: textToFind, options: .caseInsensitive)
if range.location != NSNotFound {
addAttribute(NSForegroundColorAttributeName, value: color, range: range)
}
}
}
용법
func setColoredLabel() {
let string = NSMutableAttributedString(string: "Here is a red blue and green text")
string.setColorForText("red", with: #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1))
string.setColorForText("blue", with: #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1))
string.setColorForText("green", with: #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1))
mylabel.attributedText = string
}
SWIFT 4 @ kj13 알려 주셔서 감사합니다
// If no text is send, then the style will be applied to full text
func setColorForText(_ textToFind: String?, with color: UIColor) {
let range:NSRange?
if let text = textToFind{
range = self.mutableString.range(of: text, options: .caseInsensitive)
}else{
range = NSMakeRange(0, self.length)
}
if range!.location != NSNotFound {
addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range!)
}
}
속성으로 더 많은 실험을 수행했으며 결과는 다음과 같습니다. SOURCECODE
결과는 다음과 같습니다.
여기 있습니다
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:lblTemp.text];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];
lblTemp.attributedText = string;
스위프트 4
// An attributed string extension to achieve colors on text.
extension NSMutableAttributedString {
func setColor(color: UIColor, forText stringValue: String) {
let range: NSRange = self.mutableString.range(of: stringValue, options: .caseInsensitive)
self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
}
}
// Try it with label
let label = UILabel()
label.frame = CGRect(x: 70, y: 100, width: 260, height: 30)
let stringValue = "There are 5 results."
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColor(color: UIColor.red, forText: "5")
label.font = UIFont.systemFont(ofSize: 26)
label.attributedText = attributedString
self.view.addSubview(label)
결과
스위프트 3
func setColoredLabel() {
var string: NSMutableAttributedString = NSMutableAttributedString(string: "redgreenblue")
string.setColor(color: UIColor.redColor(), forText: "red")
string.setColor(color: UIColor.greenColor(), forText: "green")
string.setColor(color: UIColor.blueColor(, forText: "blue")
mylabel.attributedText = string
}
func setColor(color: UIColor, forText stringValue: String) {
var range: NSRange = self.mutableString.rangeOfString(stringValue, options: NSCaseInsensitiveSearch)
if range != nil {
self.addAttribute(NSForegroundColorAttributeName, value: color, range: range)
}
}
결과:
//NSString *myString = @"I have to replace text 'Dr Andrew Murphy, John Smith' ";
NSString *myString = @"Not a member?signin";
//Create mutable string from original one
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:myString];
//Fing range of the string you want to change colour
//If you need to change colour in more that one place just repeat it
NSRange range = [myString rangeOfString:@"signin"];
[attString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:(63/255.0) green:(163/255.0) blue:(158/255.0) alpha:1.0] range:range];
//Add it to the label - notice its not text property but it's attributeText
_label.attributedText = attString;
iOS 6 이후 확장자 나 교체가 필요하지 않도록 UIKit 지지체는 의한 문자열 도면.
에서 UILabel
:
@property(nonatomic, copy) NSAttributedString *attributedText;
당신은 그냥 당신 구축해야합니다 NSAttributedString
. 기본적으로 두 가지 방법이 있습니다.
동일한 속성을 가진 텍스트 청크 추가-각 부분에 대해 하나의 NSAttributedString
인스턴스를 만들고 하나에 추가합니다.NSMutableAttributedString
일반 문자열에서 속성을 부여한 텍스트를 만든 다음 지정된 범위에 속성을 추가합니다. 숫자 범위 (또는 기타)를 찾아 다른 색상 속성을 적용합니다.
Anups는 신속하게 답변합니다. 모든 클래스에서 재사용 할 수 있습니다.
신속한 파일
extension NSMutableAttributedString {
func setColorForStr(textToFind: String, color: UIColor) {
let range = self.mutableString.rangeOfString(textToFind, options:NSStringCompareOptions.CaseInsensitiveSearch);
if range.location != NSNotFound {
self.addAttribute(NSForegroundColorAttributeName, value: color, range: range);
}
}
}
일부 뷰 컨트롤러에서
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.labelShopInYourNetwork.text!);
attributedString.setColorForStr("YOUR NETWORK", color: UIColor(red: 0.039, green: 0.020, blue: 0.490, alpha: 1.0));
self.labelShopInYourNetwork.attributedText = attributedString;
UIWebView 또는 둘 이상의 UILabel을 갖는 것은이 상황에서 과잉으로 간주 될 수 있습니다.
내 제안 은 NSAttributedString 을 지원하는 UILabel의 드롭 인 대체물 인 TTTAttributedLabel 을 사용 하는 것입니다 . 즉, 문자열의 다른 범위에 differents 스타일을 매우 쉽게 적용 할 수 있습니다.
편집 할 필요가없는 짧은 형식의 텍스트를 표시하려면 Core Text 가 적합합니다. 사용하는 레이블 NSAttributedString
과 렌더링에 핵심 텍스트를위한 여러 오픈 소스 프로젝트가 있습니다 . 예를 들어 CoreTextAttributedLabel 또는 OHAttributedLabel 을 참조하십시오 .
NSAttributedString
갈 길입니다. 다음 질문에는이를 수행하는 방법 을 보여주는 훌륭한 답변이 있습니다. 어떻게 NSAttributedString을 사용합니까?
JTAttributedLabel (by mystcolor)을 사용하면 iOS 6의 UILabel에서 속성 문자열 지원을 사용할 수 있으며 동시에 JTAutoLabel을 통해 iOS 5의 JTAttributedLabel 클래스를 사용할 수 있습니다.
Swift 3.0 솔루션이 있습니다.
extension UILabel{
func setSubTextColor(pSubString : String, pColor : UIColor){
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.text!);
let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
if range.location != NSNotFound {
attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
}
self.attributedText = attributedString
}
}
그리고 호출의 예가 있습니다.
let colorString = " (string in red)"
self.mLabel.text = "classic color" + colorString
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red)
Swift 4 이상 : anoop4real의 솔루션 에서 영감을 얻은 여기에 2 가지 색상으로 텍스트를 생성하는 데 사용할 수있는 문자열 확장이 있습니다.
extension String {
func attributedStringForPartiallyColoredText(_ textToFind: String, with color: UIColor) -> NSMutableAttributedString {
let mutableAttributedstring = NSMutableAttributedString(string: self)
let range = mutableAttributedstring.mutableString.range(of: textToFind, options: .caseInsensitive)
if range.location != NSNotFound {
mutableAttributedstring.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
}
return mutableAttributedstring
}
}
다음 예제는 나머지 텍스트에 대해 원래 레이블 색상을 유지하면서 별표 색상을 빨간색으로 변경합니다.
label.attributedText = "Enter username *".attributedStringForPartiallyColoredText("*", with: #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1))
내 대답에는 텍스트가 한 번만 나타나는 것뿐만 아니라 모든 항목에 색상을 지정하는 옵션도 있습니다. "wa ba wa ba dubdub", 수락 된 답변과 같이 처음 발생하는 것뿐만 아니라 wa의 모든 발생을 색칠 할 수 있습니다.
extension NSMutableAttributedString{
func setColorForText(_ textToFind: String, with color: UIColor) {
let range = self.mutableString.range(of: textToFind, options: .caseInsensitive)
if range.location != NSNotFound {
addAttribute(NSForegroundColorAttributeName, value: color, range: range)
}
}
func setColorForAllOccuranceOfText(_ textToFind: String, with color: UIColor) {
let inputLength = self.string.count
let searchLength = textToFind.count
var range = NSRange(location: 0, length: self.length)
while (range.location != NSNotFound) {
range = (self.string as NSString).range(of: textToFind, options: [], range: range)
if (range.location != NSNotFound) {
self.addAttribute(NSForegroundColorAttributeName, value: color, range: NSRange(location: range.location, length: searchLength))
range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length))
}
}
}
}
이제 다음과 같이 할 수 있습니다.
let message = NSMutableAttributedString(string: "wa ba wa ba dubdub")
message.setColorForText(subtitle, with: UIColor.red)
// or the below one if you want all the occurrence to be colored
message.setColorForAllOccuranceOfText("wa", with: UIColor.red)
// then you set this attributed string to your label :
lblMessage.attributedText = message
들면 자 마린의 사용자 I 정적이 C # 1 I 문자열 배열 전달 방법, 및 UIColours UIFonts 배열의 배열 (이들은 길이에 일치해야한다). 그런 다음 속성이 지정된 문자열이 다시 전달됩니다.
보다:
public static NSMutableAttributedString GetFormattedText(string[] texts, UIColor[] colors, UIFont[] fonts)
{
NSMutableAttributedString attrString = new NSMutableAttributedString(string.Join("", texts));
int position = 0;
for (int i = 0; i < texts.Length; i++)
{
attrString.AddAttribute(new NSString("NSForegroundColorAttributeName"), colors[i], new NSRange(position, texts[i].Length));
var fontAttribute = new UIStringAttributes
{
Font = fonts[i]
};
attrString.AddAttributes(fontAttribute, new NSRange(position, texts[i].Length));
position += texts[i].Length;
}
return attrString;
}
제 경우에는 Xcode 10.1을 사용하고 있습니다. Interface Builder의 레이블 텍스트에서 일반 텍스트와 속성 텍스트 사이를 전환하는 옵션이 있습니다.
이것이 다른 사람을 도울 수 있기를 바랍니다 ..!
extension UILabel{
func setSubTextColor(pSubString : String, pColor : UIColor){
let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);
let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
if range.location != NSNotFound {
attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
}
self.attributedText = attributedString
}
}
내 솔루션은 다음과 같은 방법으로 만들어졌습니다.
-(void)setColorForText:(NSString*) textToFind originalText:(NSString *)originalString withColor:(UIColor*)color andLabel:(UILabel *)label{
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:originalString];
NSRange range = [originalString rangeOfString:textToFind];
[attString addAttribute:NSForegroundColorAttributeName value:color range:range];
label.attributedText = attString;
if (range.location != NSNotFound) {
[attString addAttribute:NSForegroundColorAttributeName value:color range:range];
}
label.attributedText = attString; }
동일한 텍스트에서 단 하나의 다른 색상으로 작동했지만 동일한 문장에서 더 많은 색상에 쉽게 적용 할 수 있습니다.
아래 코드를 사용하여 단어에 따라 여러 색상을 설정할 수 있습니다.
NSMutableArray * array = [[NSMutableArray alloc] initWithObjects:@"1 ball",@"2 ball",@"3 ball",@"4 ball", nil];
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] init];
for (NSString * str in array)
{
NSMutableAttributedString * textstr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ ,",str] attributes:@{NSForegroundColorAttributeName :[self getRandomColor]}];
[attStr appendAttributedString:textstr];
}
UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(10, 300, 300, 30)];
lab.attributedText = attStr;
[self.view addSubview:lab];
-(UIColor *) getRandomColor
{
CGFloat redcolor = arc4random() % 255 / 255.0;
CGFloat greencolor = arc4random() % 255 / 255.0;
CGFloat bluencolor = arc4random() % 255 / 255.0;
return [UIColor colorWithRed:redcolor green:greencolor blue:bluencolor alpha:1.0];
}
SwiftRichString
완벽하게 작동합니다! +
두 속성 문자열을 연결 하는 데 사용할 수 있습니다.