2017-07-06 87 views
0

我在UITextView中添加了文本,并了解了用青色将我的UITextView上色的边界。UITextView结尾的额外空间

enter image description here

后google.com有,我想删除一些额外的空间。

- (void)viewDidLoad { 
     [super viewDidLoad]; 
     NSString *desc = [self htmlAfterReplacingTagsAndAddingStyle]; 
     _descriptionTextView.attributedText = [[NSAttributedString alloc] initWithData: [desc dataUsingEncoding:NSUTF8StringEncoding] options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil]; 
     _descriptionTextView.linkTextAttributes = @{ NSForegroundColorAttributeName: [UIColor blueColor], NSUnderlineStyleAttributeName: [NSNumber numberWithInt:NSUnderlineStyleSingle] }; 
     _descriptionTextView.dataDetectorTypes = UIDataDetectorTypeLink; 
     _descriptionTextView.scrollEnabled = NO; 
     [self setTextViewHeight]; 
    } 

setTextViewHeight

- (void)setTextViewHeight { 
    UIFont *font = [UIFont fontWithName:@"OpenSans" size:14.0]; 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, _descriptionContainer.frame.size.width, CGFLOAT_MAX)]; 
    label.numberOfLines = 0; 
    label.lineBreakMode = NSLineBreakByWordWrapping; 
    label.font = font; 
    NSString *desc = [self htmlAfterReplacingTagsAndAddingStyle]; 
    label.attributedText = [[NSAttributedString alloc] initWithData: [desc dataUsingEncoding:NSUTF8StringEncoding] options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil]; 
    [label sizeToFit]; 
    _descriptionTextView.backgroundColor = UIColor.cyanColor; 
    [_descriptionTextView setContentInset:UIEdgeInsetsMake(0, 0, -80, 0)]; 
    _descriptionContainerHeight.constant = label.frame.size.height; 
    } 

我读到有关设置内容插图但这是无益的。更改-80的值不会有任何影响。

我将不胜感激一些指针,可以帮助我删除uitextView底部的额外空间。

回答

2

使用

[_descriptionTextView setTextContainerInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 

如可在UITextView类参考

textContainerInset属性的文本视图的内容区域内的文本容器的布局 区的插图来readed。

宣言

目的-C @属性(非原子,分配)UIEdgeInsets textContainerInset

讨论

此属性提供文本边距在文本视图布置 文本。默认情况下,此属性 的值为(8,0,8,0)。

希望这有助于

+0

同意。我认为OP的测量字符串高度的方法要么不正确,要么至少是浪费。 – danh

+0

@AsthaGupta我的答案解决了你的问题? –

+0

嗨Reinier - 谢谢你的答案。但它在某些情况下有效,并非全部。如果我的字符串没有换行符,那么它就像一个魅力。但是,如果我的字符串有换行符,那么我仍然面临上面发布的问题。我会upvote你的答案,但不能接受它作为解决方案:) –

0

你应该能够textContainerInset得到的地方(见@ReinierMelian答案)。还有机会,极大地简化文字高度测量...

UIFont *font = [UIFont fontWithName:@"OpenSans" size:14.0]; 
CGFloat width = _descriptionTextView.bounds.size.width; 
NSString *string = [self htmlAfterReplacingTagsAndAddingStyle]; 
CGRect rect = [string boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:font } context:nil]; 

CGRect frame = _descriptionTextView.frame; 
frame.size = CGSizeMake(width, rect.size.height); 
_descriptionTextView.frame = frame; 
// due to @ReinierMelian... 
_descriptionTextView.extContainerInset = UIEdgeInsetsMake(0, 0, 0, 0); 
+0

谢谢你的尝试,只是我的答案。但是,您的代码不会处理字符串中的空格和换行符。我需要在我的情况下保留:) –

+0

@AsthaGupta - 上面的代码完全按照文本度量系统处理任何字符串输入内容。我已经测试了它,表明高度的变化与字符串中存在的\ n的数量成正比(* font height(+ leading,line spacing,etc)) – danh

0

要删除所有填充:

[textView setTextContainerInset:UIEdgeInsetsZero]; 
textView.textContainer.lineFragmentPadding = 0; // to remove left padding 

如果你想删除多个新行成单一个, 在textViewDidEndEditing:

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\n+" options:NSRegularExpressionCaseInsensitive error:&error]; 
NSString *trimmedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@" "]; 
textView.text = trimmedString;