5

我有这个UITextView很好用,除了,我不能让里面的文本UITextView只有在 ' 的大小几乎满了之后才开始滚动UITextView, UITextView 有 4 行高,但是一旦我到达第 2 行,第 1 行就是向上推,我不希望视图开始滚动,直到我到达 5 行。scrollingEnabled = NO让它根本不滚动,所以这不起作用。

UITextView *barf_ = [[UITextView alloc] initWithFrame:CGRectMake(20.0, 310.0, 155, 50)];

barf_.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);

//[barf_ scrollRangeToVisible:NSMakeRange([barf_.text length], 0)];

barf_.layer.cornerRadius = 3.0f;

barf_.layer.borderWidth = 0.5f;

barf_.font = [UIFont fontWithName:@"Helvetica" size:13];
4

4 回答 4

2

加载 UITextView 时,将 scrollEnabled 设置为 NO。然后将文本视图的委托设置为self或其他对象并实现 UITextViewDelegate 方法

- (void)textViewDidChange:(UITextView *)textView

每当用户对视图内的文本进行更改时,都会调用此方法。在这个方法中,你需要弄清楚你的文本有多大,以及它是否超出了文本视图的范围。如果是这样,您启用滚动。使用此方法:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode

这是 NSString 上的 UIKit 类别方法。它返回一个 CGSize,它将告诉您调用它的任何文本字符串的高度。在你的情况下,它会像

CGSize textSize = [textView.text sizeWithFont:textView.font
                            constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT)
                                lineBreakMode:UILineBreakModeWordWrap];
if (textSize.height > textView.frame.size.height) {
    textView.scrollEnabled = YES;
} else {
    textView.scrollEnabled = NO;
}
于 2012-07-04T17:46:55.210 回答
2

我找到了答案,正如其他有类似问题的人提到的那样,使用小的 textView,它会自动在底部添加 32 填充。

一个简单的解决方法是添加YourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);内部shouldChangeTextInRange方法,这解决了我的问题!

于 2012-07-05T03:13:44.187 回答
2

设置contentInset可能有助于文本在UITextView. 但是,它无助于解决UITextView尽管没有更多文本可查看但启用滚动的问题。

同样,诸如此类的方法sizeWithFont也有局限性。正如 Mike Weller 的优秀博客系列iOS Development: You're Doing It Wrong中所解释的,对于 a应该有NSString多大,并不是一个好对象。UIView许多UIView子类(例如UILabelUIButton等)都有插图和其他在调整大小时必须考虑的因素。UITextLabel也不例外。

Mike Weller 关于这个主题的具体条目是:

你做错了#2:使用 -[NSString sizeWithFont:...] 调整标签大小

iOS 7 向我们承诺了更复杂的文本处理UITextView,例如textContainerInset. 但在此期间该怎么办?

好吧,首先我们知道这UITextViewUIScrollView. 因此,如果contentSize大于视图的bounds属性,则滚动视图将滚动以便我们可以看到更多内容,这是一个黄金法则。

再次检查也contentSize不起作用bounds,因为我们知道它UIScrollView已经在根据文本计算它是否应该滚动,它给了我们错误的答案。

这就是任意调整值来救援的地方!对我来说,这个值是17.f. 对你来说——取决于你的字体——它可能会有所不同。然后我们控制并决定是否应该允许滚动视图滚动:

static const CGFloat kArbritaryHeight = 17.f;
CGFloat adjustedContentHeight = myTextView.contentSize.height - kArbritaryHeight;
CGFloat boundsHeight = CGRectGetHeight(myTextView.bounds);
BOOL tooMuchContent = adjustedContentHeight > boundsHeight;

if (tooMuchContent)
{
    myTextView.scrollEnabled = YES;
}
else
{
    myTextView.scrollEnabled = NO;
}
于 2013-10-15T14:12:01.973 回答
0

您可以使用该sizeWithFont:constrainedToSize:lineBreakMode:方法检查您的字符串是否会实际呈现大于您的文本视图,并查看是否需要启用滚动。但是,您必须在设置滚动视图中的文本时调用它。

前任:

CGSize barfStringSize = [barfString sizeWithFont:[barf_ font] 
                               constrainedToSize:CGSizeMake(barf_.bounds.size.width, MAXFLOAT) 
                                   lineBreakMode:UILineBreakModeWordWrap]
[barf_ setScrollEnabled:barfStringSize.height > barf_.bounds.size.height]
于 2012-07-04T17:43:32.577 回答