5

我试图让用户能够将他们键入的文本设置为下划线,而无需当前选择文本。这适用于 iOS 6 应用程序,在 UITextView 中输入文本。它将被保存为 NSAttributedString。粗体和斜体工作正常。下划线的一些东西使它无法工作。

UITextView *textView = [self noteTextView];
NSMutableDictionary *typingAttributes = [[textView typingAttributes] mutableCopy];
[typingAttributes setObject:[NSNumber numberWithInt:NSUnderlineStyleSingle] forKey:NSUnderlineStyleAttributeName];
NSLog(@"attributes after: %@", typingAttributes);
[textView setTypingAttributes:typingAttributes];
NSLog(@"text view attributes after: %@", [textView typingAttributes]);

我的初始日志语句表明它设置为下划线:

attributes after: {
    NSColor = "UIDeviceRGBColorSpace 0 0 0 1";
    NSFont = "<UICFFont: 0xa9c5e30> font-family: \"Verdana\"; font-weight: normal; font-style: normal; font-size: 17px";
    NSKern = 0;
    NSStrokeColor = "UIDeviceRGBColorSpace 0 0 0 1";
    NSStrokeWidth = 0;
    NSUnderline = 1;
}

但是紧随其后的日志语句没有显示 nsunderline 属性。删除 textView setTypingAttributes 行没有影响。

text view attributes after: {
    NSColor = "UIDeviceRGBColorSpace 0 0 0 1";
    NSFont = "<UICFFont: 0xa9c5e30> font-family: \"Verdana\"; font-weight: normal; font-style: normal; font-size: 17px";
    NSKern = 0;
    NSStrokeColor = "UIDeviceRGBColorSpace 0 0 0 1";
    NSStrokeWidth = 0;
}

我很难过为什么我让它为粗体和斜体工作,而不是下划线。还有为什么它似乎最初获得属性,然后忘记它。请分享您可能有的任何见解。谢谢。

4

2 回答 2

4

我认为您发现了一个错误,或者至少是一些未记录的行为。如果我将打字属性设置为红色,我可以这样做:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
        replacementString:(NSString *)string {
    NSDictionary* d = textField.typingAttributes;
    NSLog(@"%@", d);
    NSMutableDictionary* md = [NSMutableDictionary dictionaryWithDictionary:d];
    // md[NSUnderlineStyleAttributeName] = @(NSUnderlineStyleSingle);
    md[NSForegroundColorAttributeName] = [UIColor redColor];
    textField.typingAttributes = md;
    return YES;
}

使用该代码,所有用户的新输入都会显示为红色。但是,如果我取消注释注释行,尝试在键入属性中添加下划线,它会破坏整个事情 - 我没有下划线,我也没有得到红色!

但是,您的问题的另一部分的答案记录在案。您必须按照我的方式进行操作,在用户输入时重新声明输入属性,因为正如文档明确指出的那样,“当文本字段的选择发生更改时,字典的内容会自动清除”(这就是你问的“忘记”)。

于 2012-11-25T01:42:23.893 回答
0

从 iOS 6 开始,UITextView 现在声明了属性属性文本,它允许您通过创建 NSAttributedString 来为文本添加下划线。这是修改后的代码:

UITextView *textView = [self noteTextView];
NSMutableDictionary *typingAttributes = [[textView typingAttributes] mutableCopy];
[typingAttributes setObject:[NSNumber numberWithInt:NSUnderlineStyleSingle] forKey:NSUnderlineStyleAttributeName];
NSLog(@"attributes after: %@", typingAttributes);
textView.attributedText = [[NSAttributedString alloc] initWithString:[textView text] attributes:typingAttributes];
NSLog(@"text view attributes after: %@", [textView typingAttributes]);

通过使用此代码,键入的任何其他文本也将符合 NSAttributedString 中设置的格式,例如下划线

希望这可以帮助!

于 2012-10-07T01:47:15.813 回答