UITextView текст не отображается, когда родительский вид UIScrollView, пока я не прокручиваю - PullRequest
5 голосов
/ 30 июля 2011

У меня есть UITextView внутри UIScrollView, который настроен вне экрана , когда приведенный ниже код запускается в моем ViewController's viewDidLoad. К сожалению, если текст «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)];

Спасибо

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Я смог заставить это работать, установив текст 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];
    }
}

Если у кого-то есть лучшее решение или требуется больше объяснений, просто напишите мне в комментариях.

1 голос
/ 27 января 2012

У меня была такая же проблема, и мне потребовалось несколько часов, чтобы найти подходящее решение для нее ... Вот что я придумал ...

-(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 будет отображаться во всей анимации.

0 голосов
/ 30 июля 2011

Похоже, что настраиваемые виды не обновляются.
А когда вы взаимодействуете с представлениями, они обновляются, и ваши изменения отображаются на дисплее ...

Попробуйте добавить [txtDetails setNeedsDisplay]; [page3ScrollView setNeedsDisplay]; после вашего кода в viewDidLoad.

Если это поможет, возможно, мы найдем более элегантное решение ...

...