UITextView не совсем подходит для NSTextContainer

Я только что создал собственный метод, используя TextKit стек, но меня смущает то, что кажется разницей между размером NSTextContainer и NSTextView Размер рамки. Текст имеет белую рамку, и я хотел бы знать, как от него избавиться (см. Обновление). Область, следующая за последним символом, также белая. Я установил атрибут для backgroundColor используя диапазон, который соответствует длине строки, но до сих пор я не нашел способ применить этот атрибут ко всей области.

Я пробовал различные комбинации настроек для NSTextContainer и текстовый фрейм UITextView, Следующие операторы ближе всего подходят к желаемому результату, но белая граница все еще там.

    // A
    textContainer = [[NSTextContainer alloc] initWithSize:textFrame.size];

    // D 
    UITextView *textView = [[UITextView alloc] initWithFrame: textFrame textContainer: textContainer];

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

Я работал через учебники по TextKit здесь и здесь и просматривал документацию Apple здесь и здесь. Я также проверил ближайший вопрос и да, мой appDelegateимеет

    [self.window makeKeyAndVisible];

Обновить

Белая граница былаудалена после ответа здесь (спасибо Ларме)

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

Следующие заявления были добавлены к textView в конце метода

    textView.textContainerInset = UIEdgeInsetsZero;
    textView.textContainer.lineFragmentPadding = 0;

Если это уместно, приложение было запущено в iOS 4. Теперь оно работает под управлением iOS 11 с использованием Xcode Version 9.2. Он уже использует textView а также TextKit в настоящее время рассматривается (неохотно) как способ удовлетворить ряд запросов от тестировщиков приложений. Так что любой указатель, который может помочь объяснить и исправить эту проблему, будет приветствоваться.

Спасибо в ожидании.

Вот код для метода. helpMessage читается из массива (не показан).

    -(id)formatHelpText:(NSString*)helpMessage
{
    float sideMargin   = 5;
    float topMargin    = 72;

    CGFloat textWidth  = [UIScreen mainScreen].bounds.size.width - (sideMargin * 2);
    CGFloat textHeight = [UIScreen mainScreen].bounds.size.height - (topMargin * 2);
    CGRect  textFrame  = CGRectMake(sideMargin, topMargin, textWidth, textHeight); // used for A & D


    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:helpMessage];

// define paragraph attributes

    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    [style setLineSpacing:1.5];
    [style setAlignment:NSTextAlignmentLeft];

// use attributedText to define character attributes

    float spacing        = 0.0f;
    float baselineOffSet = 1.0f;

    [attributedText setAttributes:@{
                                NSFontAttributeName:[UIFont preferredFontForTextStyle:UIFontTextStyleBody],
                                NSBaselineOffsetAttributeName:[NSNumber numberWithFloat:baselineOffSet],
                                NSForegroundColorAttributeName:[UIColor whiteColor],
                                NSBackgroundColorAttributeName:[UIColor grayColor],
                                NSParagraphStyleAttributeName:style,
                                NSKernAttributeName:@(spacing)
                                }
                        range:range];


// TextKit - non-view

    NSTextStorage *textStorage;
    NSLayoutManager *layoutManager;
    NSTextContainer *textContainer;

    textStorage   = [[NSTextStorage alloc] initWithAttributedString:attributedText];
    layoutManager = [[NSLayoutManager alloc] init];
    textContainer = [[NSTextContainer alloc] init];

    [textStorage addLayoutManager:layoutManager];


// A
    textContainer = [[NSTextContainer alloc] initWithSize:textFrame.size];
// B 
//    textContainer = [[NSTextContainer alloc] initWithSize:[UIScreen mainScreen].bounds.size];   
    [layoutManager addTextContainer:textContainer];


// C
//    UITextView *textView = [[UITextView alloc] initWithFrame: [UIScreen mainScreen].bounds textContainer: textContainer];
// D 
    UITextView *textView = [[UITextView alloc] initWithFrame: textFrame textContainer: textContainer];


// update

    textView.textContainerInset = UIEdgeInsetsZero;
    textView.textContainer.lineFragmentPadding = 0;

    return textView;
}

1 ответ

Обе проблемы сейчас решены. Белая граница была удалена с помощью UIEdgeInsetsZero очистить настройки по умолчанию и textContainer.lineFragmentPadding = 0 (спасибо, Ларм). Я спрятал невыделенную часть последней строки UITextView удалив цвет фона в качестве атрибута символа и определив его вместо свойства textView.sizeToFit добавлено, чтобы минимизировать количество строк в textView, Вот окончательный код

#import "HelpTextView.h"

@implementation HelpTextView

-(id)formatHelpText:(NSString*)helpMessage
{
    float sideMargin   = 5;
    float topMargin    = 72;

    CGFloat textWidth  = [UIScreen mainScreen].bounds.size.width - (sideMargin * 2);
    CGFloat textHeight = [UIScreen mainScreen].bounds.size.height - (topMargin * 2);
    CGRect  textFrame  = CGRectMake(sideMargin, topMargin, textWidth, textHeight);

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:helpMessage];

    // define paragraph attributes

    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    [style setLineSpacing:0.5];
    [style setAlignment:NSTextAlignmentLeft];

    float spacing = 0.0f;
    float baselineOffSet = 1.0f;
    NSRange range = (NSRange){0,[attributedText length]};

    // use attributedText to define character attributes

    [attributedText setAttributes:@{
                                NSFontAttributeName:[UIFont preferredFontForTextStyle:UIFontTextStyleBody],
                                NSBaselineOffsetAttributeName:[NSNumber numberWithFloat:baselineOffSet],
                                NSForegroundColorAttributeName:[UIColor whiteColor],
                                NSParagraphStyleAttributeName:style,
                                NSKernAttributeName:@(spacing)
                                }
                        range:range];

    NSTextStorage* textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedText];
    NSLayoutManager *layoutManager = [NSLayoutManager new];
    [textStorage addLayoutManager:layoutManager];

    CGSize containerSize = CGSizeMake(textFrame.size.width, CGFLOAT_MAX);
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:containerSize];

    [layoutManager addTextContainer:textContainer];

    UITextView *textView = [[UITextView alloc] initWithFrame: textFrame textContainer: textContainer];
    textView.textContainerInset = UIEdgeInsetsZero;
    textView.textContainer.lineFragmentPadding = 0;
    textView.editable = NO;
    textView.scrollEnabled = NO;
    textView.backgroundColor = [UIColor grayColor];
    [textView sizeToFit];

    return textView;
}
Другие вопросы по тегам