父视图为 UIScrollView 时不显示 UITextView 文本,直到我 scoll

Posted

技术标签:

【中文标题】父视图为 UIScrollView 时不显示 UITextView 文本,直到我 scoll【英文标题】:UITextView text not displayed when parent view is UIScrollView UNTIL I scoll 【发布时间】:2011-07-30 09:28:41 【问题描述】:

当下面的代码在我的ViewController'sviewDidLoad 中运行时,我在UIScrollView 中配置了一个UITextView。不幸的是,如果“eventDetails”文本特别长,则在我与之交互之前,UITextView 内不会显示任何内容(例如单击内部并拖动)。

我的问题:如何在不强制用户首先与UITextView 交互的情况下让文本显示在 UITextView 中?

代码如下:

UITextView *txtDetails = [[UITextView alloc] initWithFrame:CGRectMake(-4, yOffset, page3ScrollView.frame.size.width, 0)];
[txtDetails setEditable:NO];
[txtDetails setScrollEnabled:NO];
[txtDetails setFont:[UIFont systemFontOfSize:12]];
[txtDetails resizeAndSetTextWithMaxSize:CGSizeMake(txtDetails.frame.size.width, 999999999) forText:eventDetails withAdditionalHeightOf:16.f];

[page3ScrollView addSubview:txtDetails];

CGRect frame = txtDetails.frame;
frame.size.height = [txtDetails contentSize].height;
txtDetails.frame = frame;

[page3ScrollView setContentSize:CGSizeMake(page3ScrollView.frame.size.width, txtDetails.frame.origin.y + txtDetails.frame.size.height)];

谢谢

【问题讨论】:

【参考方案1】:

我能够通过仅在需要时设置 UITextView 的文本(例如即将出现在屏幕上)来实现此功能。下面是相关代码:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)sv 

    if (sv == scrollView) [self updatePagedView];


- (void)updatePagedView

    int currentPage = pageControl.currentPage;

    // *** loadDetailsPage3 is where I set the text ***
    if (currentPage == 2) 
        [self loadDetailsPage3];
    

如果有人有更好的解决方案或需要更多解释,请在 cmets 中联系我。

【讨论】:

【参考方案2】:

我也遇到了同样的问题,我花了好几个小时才找到合适的解决方法...这就是我想出的...

-(void)DidBecomeActive 
    if (!DidUpdateBounds) 
        DidUpdateBounds = true; // instance variable set to false on load
        NSString *oldtext = uiTextView.text;

        //The trick is (1) removing it from it's superview
        // (2) resetting it's 'text' property
        // (3) re-adding it to the view WHILE it's on-screen.
        [uiTextView removeFromSuperview];
        uiTextView.text = oldtext;
        [self.view addSubview:uiTextView];
        [self.view setNeedsDisplay];
    

我正在使用 CoreAnimation 切换到此视图。所以在我执行该代码之前,我称之为

//The 0,-300,480,300 is bounds of the UIView my offscreen UITextview is on
[self.view.layer setBounds:CGRectMake(0, -300, 480, 300)];

// SetNeedsDisplay, then call my method above to
//FORCIBILY redrew the UITextView while it's effectively on-screen
[self.view setNeedsDisplay];
[TextLogVC DidBecomeActive];
//CoreAnimation then goes here

这解决了这个问题。设置 layer.bounds 后,它会重绘控件(UITextView)并认为它在屏幕上。然后 CoreAnimation 负责从我当前的 UIView 到新的 UIView 的动画,并且 uiTextView 中的所有文本都会在整个动画中显示。

【讨论】:

【参考方案3】:

您设置的视图似乎没有刷新。 当您与视图交互时,它们会被刷新,并且您的更改会呈现到显示...

尝试在viewDidLoad 中的代码后添加[txtDetails setNeedsDisplay]; [page3ScrollView setNeedsDisplay];

如果它会有所帮助,那么也许我们会找到一些更优雅的解决方案......

【讨论】:

已经尝试过了,不幸的是它根本没有影响用户界面。就像我上面说的,奇怪的是,如果 UITextView 的文本有点长,我只会得到这种行为。无论如何,感谢您的尝试。

以上是关于父视图为 UIScrollView 时不显示 UITextView 文本,直到我 scoll的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中为 zoomScale 设置动画时不需要的滚动

UIScrollView 仅在显示键盘时才需要

UIView(放置在滚动视图内)在以编程方式更改高度常量时不显示其子视图

如何使用主 iPhone 视图之外的 UI 元素在 Interface Builder 中设置 UIScrollView?

UIScrollView 下拉父视图

uiscrollview 中的图像显示