UITextView中的大文本被切断,这是UIScrollView内部

时间:2013-09-09 10:59:29

标签: iphone ios uiscrollview uitextview

我遇到了一个严重的问题,我似乎无法修复,这让我在过去两天疯狂。我已经进行了广泛的搜索,但我找不到解决办法,即使我尝试了很多。

UITextView内有UIScrollView。我能够动态调整scrollview中的UITextView以显示文本。但是当UITextView包含非常大的文本时,当我几乎滚动到最后时它会被切断。但是,UIScrollView的框架仍然正确调整大小。

我阅读了这些帖子:this this和许多相似的帖子。

使用AutoLayout在xib中创建UIScrollviewUITextview

这是我当前的代码和截图,因为您可以看到屏幕截图中的空白位置应填充文本。请帮忙。

enter image description here

- (void)viewDidAppear:(BOOL)animated
{
    CGRect frame = self.longDescField.frame;
    frame.size.height = self.longDescField.contentSize.height;
    self.longDescField.frame = frame;

    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width,  self.longDescField.contentSize.height + 200);
    self.scrollView.scrollEnabled = YES;
    [self.scrollView flashScrollIndicators];
}

16 个答案:

答案 0 :(得分:129)

此问题自iOS 7以来就已存在,并且仍然存在于iOS 12中。

但是,正如@igz推荐的那样,我无法通过在调整大小之前设置scrollEnabled = NO来保持正常的滚动行为。相反,我在调整大小

后切换了滚动onoff
// Resize text view here

textView.scrollEnabled = NO;
textView.scrollEnabled = YES;

这会强制剪切文本正确呈现。

答案 1 :(得分:15)

感谢大家的帮助。这最终最终会在iOS7中为我工作。

我必须禁用此特定xib的自动布局

然后做了以下事情:

[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];

答案 2 :(得分:10)

对我来说,解决方法是在自定义textView

后放置sizeToFit
[self.yourTextView sizeToFit];

这应该是您在操作textview时所做的最后一件事,不应该在填充内容文本之前。

答案 3 :(得分:7)

绝对是iOS7。我有同样的问题适用于所有调整大小的UITextViews,生成xib和代码。我发现在改变UITextView框架后需要调整textContainer.size。

我创建了这个类别代码来调整textContainer.size,但是在设置文本值之后似乎也需要调整,所以如果没有设置框架大小,我必须在任何文本更改后调用adjustAfterFrameChange。 这段代码假设UITextView没有对setFrame执行任何操作:本身取出setFrame:如果你想避免这种风险,请手动调用adjustAfterFrameChange

修改:已更改

self.textContainer.size = self.frame.size; // fix for cut off text

self.textContainer.size = self.contentSize; // fix for cut off text

@interface UITextView(Extras)

- (void)adjustAfterFrameChange;

@end



@implementation UITextView(Extras)

- (void)adjustAfterFrameChange {
#if defined(__IPHONE_7_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
    if ([self respondsToSelector:@selector(textContainer)])
        self.textContainer.size = self.contentSize; // fix for cut off text
#endif
}


- (void)setFrame:(CGRect)frame {
    [super setFrame:frame];

    [self adjustAfterFrameChange];
}

@end

答案 4 :(得分:5)

试试这个

[self.textView setContentInset:UIEdgeInsetsMake(-8.0, 0, -8.0, 0)];

它适用于UITextView中的剪切文本显示。

答案 5 :(得分:5)

我遇到了类似的问题,其中长文本在调整文本视图大小后被切断了。 在调整大小之前关闭scrollingEnabled似乎解决了它。当然看起来像是IOS 7的错误。

答案 6 :(得分:5)

可以通过将连续布局属性设置为false来解决此问题。

textView.layoutManager.allowsNonContiguousLayout = false

虽然文档说默认值为false,但实际上UITextView设置为true。

答案 7 :(得分:2)

试试吧。

在IOS 8和Xcode 6.3中,

textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];

答案 8 :(得分:1)

我们在推出iOS7时出现了这样的问题。当我们调用setText时,它向我们的UITextView添加了一行(或多行),textview没有使用正确的新高度进行重绘。 setNeedsDisplay,setNeedsLayout,重绘图层,重绘整个视图等都不起作用。最后,我们强迫失去并获得关注:

[textView resignFirstResponder];
[textView becomeFirstResponder];

这迫使高度重新计算并纠正重绘。值得庆幸的是,它不会导致键盘弹出,但是在您的应用支持的任何iOS版本上都值得回归测试。

答案 9 :(得分:1)

这种情况一直发生在Interface Builder中。

选择文本视图后,在“实用程序检查器”中取消选中“显示垂直指示器”选项。现在出现裁剪文本。

答案 10 :(得分:1)

这些答案都不适合我。

我在故事板上愚弄,不知怎的,它现​​在正在工作。它在故事板中看起来仍然不对,但在设备上它现在显示得很好。

我做了各种各样的事情,包括切换文本字段的许多选项。

认为为我修复的是使视图更大,构建并再次使其成为正确的尺寸

我为一个模糊的不确定答案道歉,但也许它会有所帮助。这个项目最初是为iOS 5编写的,从那以后文本视图可能不会被搞砸了。

答案 11 :(得分:1)

我对textview有相同的问题(没有scrollview)。只需取消选中“属性”检查器中的“滚动已启用”即可解决此问题(Xcode 7.3.1,iOS 9.3)。

答案 12 :(得分:0)

我可能错了,但我不完全理解你的问题,但使用UIScrollView有什么用,因为UITextView类实现了可滚动的多行文本区域的行为?

您应该丢弃UIScrollView。

答案 13 :(得分:0)

我面临同样的情况。我必须禁用UITextView的滚动,这样做会导致最后一行被删除。这是我的解决方案:

//In the  UITextView subClass, override "gestureRecognizerShouldBegin" and let the scrolling of UITextView remain on.

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && gestureRecognizer.view == self){
        return NO;
    }
    return [super gestureRecognizerShouldBegin:gestureRecognizer];
}

答案 14 :(得分:0)

在Swift中,我只需设置 private void NodeConfigurationWizardCustomizeCommandButtons(object sender, CustomizeCommandButtonsEventArgs e) { _nextButton = e.NextButton;} private void GetRowsButtonClick(object sender, EventArgs e) { var rowList = ServiceClient.GetAvailableRows(); var rowsReturned = rowList.Count > 0; _nextButton.Button.Enabled = rowsReturned ;} 的{​​{1}}即可解决此问题:

textContainerInset

答案 15 :(得分:0)

这对我有用:

textView.scrollEnabled = NO;

//resize here

textView.scrollEnabled=YES;