2

我想做一个UITextField,它有一个静态前缀并且用户不能编辑或删除,同时它也被赋予了浅灰色的字体颜色。

文本字段的可编辑部分应始终以黑色显示。

下面给出一个例子:

在此处输入图像描述

它本质上是用于输入用户名,带有一个不断前缀的域。


我已经尝试将textFieldShouldCleartextField:shouldChangeCharactersInRange:replacementString:委托方法与 一起使用NSMutableAttributedString,但根本无法破解它:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSMutableAttributedString *text = [textField.attributedText mutableCopy];

    [text addAttribute:NSForegroundColorAttributeName value:[UIColor grayColor] range:NSMakeRange(0, 7)];

    if (textField.text.length > 7)
    {    
        [text addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(7, textField.attributedText.length - 7)];
    }
    [text addAttribute:NSFontAttributeName value:[UIFont gothamFontForSize:textField.font.pointSize andWeight:kGothamLight] range:NSMakeRange(0, textField.attributedText.length)];


    return range.location > 6;
}

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"kombit\\"];
    [text addAttribute:NSForegroundColorAttributeName value:[UIColor grayColor] range:NSMakeRange(0, 7)];
    [text addAttribute:NSFontAttributeName value:[UIFont gothamFontForSize:textField.font.pointSize andWeight:kGothamLight] range:NSMakeRange(0, text.length)];
    textField.attributedText = text;

    [textField setSelectedTextRange:[textField textRangeFromPosition:[textField endOfDocument] toPosition:[textField endOfDocument]]];

    return NO;
}

我确信有人已经做过类似的事情。

4

2 回答 2

9

下面的代码从您的永久文本中创建一个属性字符串,将其着色为灰色,并将其添加到文本字段中。然后进行shouldChangeCharactersInRange:范围比较以确定范围是否在“kombit”应该占据的区域内,如果不是,则将黑色着色属性传递回文本字段。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.textField setDelegate:self];

    NSString *fixedString = @"kombit\\";
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:fixedString];

    [attributedString addAttribute:NSForegroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange(0, fixedString.length)];

    [self.textField setAttributedText:attributedString];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSRange substringRange = [textField.text rangeOfString:@"kombit\\"];

    if (range.location >= substringRange.location && range.location < substringRange.location + substringRange.length) {
        return NO;
    }

    NSMutableAttributedString *attString = [textField.attributedText mutableCopy];

    [attString addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(substringRange.length, textField.text.length - substringRange.length)];

    [textField setAttributedText:attString];

    return YES;
}

编辑:

好吧,这不是我所期望的如此痛苦的事情,坦率地说,我很尴尬地发布这段代码,因为它真的很脏,但它似乎比以前做得更好。

我最终做的是创建一个属性来引用 BOOL 来保存文本是否应该更新(以阻止递归)并将目标添加到文本字段的UIControlEventEditingChanged控制事件以在发生编辑时获取回调。

然后,由于某种原因,这里似乎没有一种正常的执行方式,我通过在调用 resignFirstResponder 之后直接调用 becomeFirstResponder 将“光标”移动到文本字段的末尾,令人惊讶的是这非常有效。我尚未确定文本大小略有变化的问题,但这应该只是添加其他属性以匹配您想要的字体大小的问题

抱歉,我无法再帮助解决这个问题,这是一个非常奇怪的问题。而且我通常不愿意建议这个,但是在花了这么多时间尝试做一些应该是微不足道的事情之后,我开始认为 NSAttributedString 中发生了一些错误。无论如何,如果这段代码最终会引导您找到答案,请告诉我,我会对解决方案非常感兴趣。

@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (nonatomic, assign) BOOL shouldUpdateAttributes;



- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.textField setDelegate:self];
    [self.textField setSpellCheckingType:UITextSpellCheckingTypeNo];
    [self setShouldUpdateAttributes:YES];


    NSString *fixedString = @"kombit\\ ";
    [self.textField setText:fixedString];

    [self.textField addTarget:self action:@selector(textFieldDidChangeText:) forControlEvents:UIControlEventEditingChanged];
    [self textFieldDidChangeText:self.textField];
}

- (void)textFieldDidChangeText:(UITextField *)sender
{
    if (self.shouldUpdateAttributes) {
        [self setShouldUpdateAttributes:NO];

        NSString *fixedString = @"kombit\\ ";

        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:sender.text];

        [attributedString setAttributes:@{NSForegroundColorAttributeName: [UIColor lightGrayColor]} range:NSMakeRange(0, fixedString.length)];
        [attributedString setAttributes:@{NSForegroundColorAttributeName: [UIColor blackColor]} range:NSMakeRange(fixedString.length, sender.text.length - fixedString.length)];

        [sender setAttributedText:attributedString];
        [sender resignFirstResponder];
        [sender becomeFirstResponder];
    }
}


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    [self setShouldUpdateAttributes:YES];
    NSString *fixedString = @"kombit\\";
    NSRange substringRange = [textField.text rangeOfString:fixedString];

    if (range.location >= substringRange.location && range.location < substringRange.location + substringRange.length) {
        return NO;
    }

    return YES;
}
于 2013-08-20T12:50:31.030 回答
-1

简单地UILabel(按您想要的样式)放在左侧并为文本UITextField设置 rect 。UITextField's

http://alwawee.com/wordpress/2013/02/18/uitextfield-edge-insets/

于 2013-08-20T10:56:14.217 回答