2016-04-05 8 views
1

У меня есть четыре кнопки на контроллере представления и текстовом виде. Эти пять кнопок имеют цвета, например красный, желтый, зеленый, синий и черный.Как покрасить текст в UITextView

Когда пользователь начал вводить текст без нажатия этих кнопок, цвет напечатанного текстового вида должен иметь текст черного цвета. Если пользователь нажимает красную кнопку, цвет текста с этой точки должен быть красным, пока пользователь не нажмет любую другую цветную кнопку.

enter image description here

Как это сделать? Ive следовало этому руководству https://www.objc.io/issues/5-ios7/getting-to-know-textkit/

Но не знаю, как настроить его на то, чего я хочу достичь.

+0

Вы могли бы хотеть попробовать подклассы 'UITextView' и реализовать/переопределение' textStylingAtPosition (_: Косвенность:) '' из протокола UITextInput' – zcui93

ответ

1

Вот как я продолжу, если он может поможет вам:

1- add one property to retain current Color and initialize it with black color 

@property (nonatomic, retain) UIColor *curColor;//in your interface declaration 

self.curColor = [UIColor blackColor];//Init it in Viewdidload for example 

2- реализующий UITextViewDelegate

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{ 

    NSAttributedString *currentText = self.Textview.attributedText;//To store current text and its attributs 
    NSAttributedString *newOneText = [[NSAttributedString alloc] initWithString:text attributes:@{NSForegroundColorAttributeName:self.curColor}];//for the new text with selected color 

    NSMutableAttributedString *shouldDisplayText = [[NSMutableAttributedString alloc] initWithAttributedString: currentText]; 

    [shouldDisplayText appendAttributedString: newOneText];// add old and new text 

    self.Textview.attributedText = shouldDisplayText;//set it ton control 


    return NO; 
} 

3- Добавить IBAction для изменения цвета =>

- (IBAction) redColorClicked 
    { 
    self.curColor = [UIColor colorWithRed:1.0f green: 0.0f blue:0.0f alpha:1.0f]; 
    } 

- (IBAction) blueColorClicked 
     { 
     self.curColor = [UIColor colorWithRed:0.0f green: 0.0f blue:1.0f alpha:1.0f]; 
    } 
+0

Хотя это способ достичь ожидаемого результата, при нажатии на клавиатуре символов он удваивает набираемый символ. Как это сделать без дублирования персонажа? – Ankahathara

+0

Привет! Извините за поздний ответ. Как сделать это без дублирования персонажа? просто изменить retunr из UITextView делегата: - (BOOL) TextView: (UITextView *) TextView shouldChangeTextInRange: (NSRange) диапазоне replacementText: (NSString *) текст Для NO, и вы сделали. Я изменил код выше, чтобы заполнить вашу потребность – MRKT

1

Вам необходимо использовать класс NSAttributedString.

let defaultAttributes = [NSFontAttributeName: UIFont.systemFontOfSize(UIFont.systemFontSize()), 
         NSForegroundColorAttributeName: UIColor.blackColor()] 
let text = "this text is red and yellow" 
let str = NSMutableAttributedString(string: text, attributes: defaultAttributes) 
str.setAttributes([NSForegroundColorAttributeName: UIColor.redColor()], range: (text as NSString).rangeOfString("red")) 
str.setAttributes([NSForegroundColorAttributeName: UIColor.yellowColor()], range: (text as NSString).rangeOfString("yellow")) 
textView.attributedText = str 
1

Для этого вы можете использовать NSMutableAttributedString. Идея заключается в следующем (я не проверял, просто написал здесь рукой):

NSString *str = @"stackoverflow"; 
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:str]; 

// Set foreground color of "stack" substring in our string to red 
[attributedString addAttribute:NSForegroundColorAttributeName 
    value:[UIColor redColor]; 
    range:NSMakeRange(0, 5)]; 

Используя этот метод, вы можете добиться того, что вы хотите применять цвет для диапазонов, которые вы хотите в тексте.

Вы можете установить приписываемое текст вы UILabel так:

yourLabel.attributedText = attributedString 
Смежные вопросы