5

我有一个 UITextView,它被设计为在需要时放大以适应 contentView。但是,当我粘贴一段文本时,它会将内容的起点和终点垂直放置在错误的位置。输入或删除字符会将其重置回正确的位置。

任何想法为什么会这样?

-(void)textViewDidChange:(UITextView *)textView {
    self.textView.frame = CGRectMake(
        self.textView.frame.origin.x,
        self.textView.frame.origin.y,
        self.textView.frame.size.width,
        self.textView.contentSize.height + HEADER_ADDITIONAL_HEIGHT);

    self.textView.contentOffset = CGPointMake(0, 0);

    self.previousContentSize = textView.contentSize;
}
4

2 回答 2

1

当我使用:

textView.contentSize = textView.frame.size;  
textView.contentOffset = CGPointZero;  

它解决了我的问题,但产生了一个新问题,我们有时会在输入或删除文本时出现奇怪的滚动。所以,我用了这个:

textView.contentSize = CGSizeMake( textView.contentSize.width,
                                   textView.contentSize.height+1);  

这也解决了这个问题。我认为我们在这里都需要的是每当contentSizetextview 更改时我们得到的效果。不幸的是,我不知道这种效果是什么。如果有人知道,请告诉。

更新:我找到了一种可以用来解决问题的方法(我用它来解决我的问题)。你可以让 NSLayoutMAnager 刷新整个布局:

[textView.textStorage edited:NSTextStorageEditedCharacters range:NSMakeRange(0, textView.textStorage.length) changeInLength:0];

NSLayoutManager 试图避免刷新布局,因为它耗时且需要大量工作,因此它设置为仅在绝对必要时(懒惰地)执行。有许多invalidateLayout与此类相关的函数,但它们在调用时都不会导致实际的重新布局。

于 2014-05-26T14:04:12.077 回答
-1

我知道这来晚了,但我遇到了这个问题,并认为我应该分享我的想法,以防其他人发现自己处于同样的情况。

您走在正确的轨道上,但是textViewDidChange:您错过了一件重要的事情:在更新帧高度后设置 contentSize 。

// I used 0.f for the height, but you can use another value because according to the docs:
//  "the actual bounding rectangle returned by this method can be larger 
//    than the constraints if additional space is needed to render the entire 
//    string. Typically, the renderer preserves the width constraint and 
//    adjusts the height constraint as needed."
CGSize size = CGSizeMake(textview.frame.size.width, 0.f);
CGRect rect = [string boundingRectWithSize:size
                                   options:OptionsYouNeedIfAny // NSStringDrawingOptions
                                   context:nil];

// Where MinTextViewHeight is the smallest height for a textView that 
//   your design can handle
CGFloat height = MAX(ceilf(rect.size.height), MinTextViewHeight); 
CGRect rect = textView.frame;
rect.size.height = height;
textView.frame = rect;

// Adjusting the textView contentSize after updating the frame height is one of the things you were missing
textView.contentSize = textView.frame.size;
textView.contentOffset = CGPointZero;

我希望这有帮助!

有关使用boundingRectWithSize:options:context:.

于 2014-04-29T20:46:19.777 回答