Изменение шрифта при выборе NSTextField

Я хочу создать простую метку с атрибутной строкой. Я делаю это вот так:

NSDictionary *noNotificationsAttrs = [NSDictionary dictionaryWithObjectsAndKeys:centredStyle,
                                      NSParagraphStyleAttributeName,
                                      [NSFont fontWithName:@"Raleway-Bold" size:30],
                                      NSFontAttributeName,
                                      _grey,
                                      NSForegroundColorAttributeName,
                                      nil];
NSMutableAttributedString *noNotificationsString =
[[NSMutableAttributedString alloc] initWithString:@"No Notifications"
                                       attributes:noNotificationsAttrs];

NSTextField* title_field = [[NSTextField alloc] initWithFrame:
                             CGRectMake(
                                        0,
                                        0,
                                        200,
                                        200
                                        )
                             ];
[title_field setWantsLayer:true];
[title_field setSelectable:YES];
[title_field setAllowsEditingTextAttributes:true];
[title_field setAttributedStringValue:noNotificationsString];
[title_field setEditable:false];
[title_field setBordered:false];
title_field.tag = 1;

Что получится так:

введите описание изображения здесь

и

введите описание изображения здесь

К сожалению, при нажатии (выборе) этого ярлыка это выглядит следующим образом:

введите описание изображения здесь

и

введите описание изображения здесь

Это немного смелее и пиксельно вокруг углов. Это происходит с множеством других ярлыков с разными строками, размерами и цветами. Как я могу исправить?!

Обратите внимание, что эти метки вложены внутри nsscrollviewnstableviewviewForTableColumn


Стек на выбор:

введите описание изображения здесь Я считаю, что проблема заключается в том, что NSCell вызывает функцию редактирования в mousedown.


Шрифт также отличается при выборе! введите описание изображения здесь


Изменить:

Интересно, если я удалю wantslayer:YES из родительского представления (2), он этого не сделает. Но они оба нуждаются в wishlayer, иначе я не могу иметь изогнутые углы и т.д.

Ответ 1

Добавьте эту строку в свой код.

NSTextView *textEditor = (NSTextView *)[[[NSApplication sharedApplication] keyWindow] fieldEditor:YES forObject:title_field];

[textEditor setSelectedTextAttributes:noNotificationsAttrs];

Таким образом, добавление атрибутов в NSTextView, связанных с окном во время выделения.

То, что вы получаете теперь, как жирный шрифт и изменения шрифта после выбора, будет отменено.

Edit:

Рабочий код

Сменили NSForegroundColorAttributeName на NSBackgroundColorAttributeName и _grey до [NSColor clearColor]

NSDictionary *noNotificationsAttrs = [NSDictionary dictionaryWithObjectsAndKeys:centredStyle,
                                      NSParagraphStyleAttributeName,
                                      [NSFont fontWithName:@"Raleway-Bold" size:30],
                                      NSFontAttributeName,
                                      [NSColor clearColor],
                                      NSBackgroundColorAttributeName,
                                      nil];

Ответ 2

Чтобы исправить это, я создал пользовательский NSTextField, где при его выборе он обновляется следующим образом:

- (void)textViewDidChangeSelection:(NSNotification *)a{
    [self setNeedsDisplay:YES];
    [self setNeedsLayout:YES];
    [self.superview setNeedsLayout:YES];
    [self.superview setNeedsDisplay:YES];
}

но все же действует смешно несколько раз

Ответ 3

Я исправил это идеально! надеюсь помочь всем.

1.lazy property
- (NSTextField *)textFieldOne{
    if (!_textFieldOne) {
        _textFieldOne = ({
            NSTextField *view = [[NSTextField alloc]init];

            view.cell.scrollable = true;

            view.font = [NSFont fontWithName:@"PingFangSC-Light" size:14];
            view.cell.wraps = true;

            view.editable = false;
            view.selectable = true;
            view.allowsEditingTextAttributes = true;
            if (@available(macOS 10.12.2, *)) {
                view.automaticTextCompletionEnabled = true;
            } else {
                // Fallback on earlier versions
            }
            view;
        });
    }
    return _textFieldOne;
}

2.
// @{string: url}
NSDictionary *dic = @{
                      @"github/shang1219178163": @"https://github.com/shang1219178163",
                          };
  self.textFieldOne.stringValue = [NSString stringWithFormat:@"%@\n%@\n%@", NSApplication.appName, NSApplication.appCopyright, @"github/shang1219178163"];
 [self.textFieldOne setHyperlinkDic:dic];


3.
#import "NSTextField+Helper.h"

-(void)setHyperlinkDic:(NSDictionary *)dic{
    // both are needed, otherwise hyperlink won't accept mousedown
    NSTextField *textField = self;
    NSDictionary * attributes = @{
                                  NSFontAttributeName: textField.font,
                                  };

    __block NSMutableAttributedString *mattStr = [[NSMutableAttributedString alloc]initWithString:textField.stringValue attributes:attributes];
    [dic enumerateKeysAndObjectsUsingBlock:^(NSString * key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSURL *url = [NSURL URLWithString:obj];
        NSAttributedString * attStr = [NSAttributedString hyperlinkFromString:key withURL:url font:textField.font];
        NSRange range = [mattStr.string rangeOfString:key];
        [mattStr replaceCharactersInRange:range withAttributedString:attStr];

    }];
    textField.attributedStringValue = mattStr;

    textField.cell.wraps = true;
    textField.cell.scrollable = true;
    textField.editable = false;
    textField.selectable = true;
    textField.allowsEditingTextAttributes = true;

}

4.
#import "NSAttributedString+Helper.h"

+(id)hyperlinkFromString:(NSString *)string withURL:(NSURL *)aURL font:(NSFont *)font{
    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString: string];

    NSRange range = NSMakeRange(0, attrString.length);

//    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc]init];
    NSDictionary * dic = @{
                           NSFontAttributeName: font,
                           NSForegroundColorAttributeName: NSColor.blueColor,
                           NSLinkAttributeName: aURL.absoluteString,
                           NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle),
//                           NSParagraphStyleAttributeName: paraStyle,
//                           NSBaselineOffsetAttributeName: @15,
                           };


    [attrString beginEditing];
    [attrString addAttributes:dic range:range];
    [attrString endEditing];
    return attrString;
}

дисплей