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;
}