2008-09-25 6 views
1

Я хочу иметь UIScrollView с набором подзонов, где каждое из этих подзонов имеет UITextView с другим текстом. Для этой задачи я изменил пример PageControl из яблочного «центра iphone dev», чтобы добавить его в вид UITextView к представлению, которое используется для создания представлений прокрутки. Когда я запускаю приложение (как на симуляторе, так и на телефоне), отображается NO Text, но если я активирую «взаимодействие с пользователем» и нажимаю на него, текст появляется волшебным (как и клавиатура).Текст из UITextView не отображается в UIScrollView

У кого-нибудь есть решение или достигнутый прогресс с UITextView внутри UIScrollView? Благодарю.

ответ

2

Я думаю, проблема связана с тем, что UITextView является подклассом UIScrollView, поэтому у вас есть прокрутки, встроенные в UIScrollViews. Даже если текст отображается правильно, у вас будут проблемы с удобством использования, так как никогда не было бы ясно, должен ли проведите пальцем по внешнему виду или текстовому виду.

Да, это похоже на Safari, но это необходимо, и это не самая приятная часть использования Safari.

Я думаю, что это одно из тех случаев, когда трудность указывает на то, что вы работаете против системы. Я настоятельно рекомендую вернуться и переосмыслить пользовательский интерфейс.

+0

Спасибо за ваш ответ. Я также думаю, что ошибка связана с тем, что UITextView является подклассом UIScrollView, так как это также происходит с UIWebView. Однако я не думаю, что это попытка работать против система, так как это естественный способ отображения набора шагов или команд – muesan 2008-10-02 09:46:30

+1

Я согласен, но я не думаю, что это ошибка, это особенность. Я не вижу, чтобы Apple избегала этого. – 2009-04-15 11:10:29

-1

он работает для меня, помещая присвоение текстового значения в метод scrollViewDidScroll.

Примеры фрагментов:


SAMPLE.h

... 
@interface myRootUIViewController : UIViewController <UIScrollViewDelegate> 
... 

Комментарий: Просто помните: не забывайте протокол UIScrollViewDelegate.


SAMPLE.m

- (void)viewDidLoad { 
     ... whatever is created before and/or after... 

     NSString * text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
          Nunc semper lacus quis erat. Cras sapien magna, porta non, 
          suscipit nec, egestas in, arcu. Maecenas sit amet est. 
          Quisque felis risus, tempor eu, dictum ac, volutpat id, 
          libero. Ut gravida, purus vitae interdum elementum, tortor 
          justo porttitor nisi, id rhoncus massa."; 

     // calculate the required frame height according to defined font size and 
     // given text 
     CGRect frame = CGRectMake(0.0, 500.0, self.view.bounds.size.width, 1000.0); 
     CGSize calcSize = [text sizeWithFont:[UIFont systemFontOfSize:13.0] 
       constrainedToSize:frame.size lineBreakMode: UILineBreakModeWordWrap]; 
       // for whatever reasons, contraintedToSize seem only be able to 
       // calculate an appropriate height if the input frame height is larger 
       // than required. Means: if your text requires height=250 and input 
       // frame height=100, then this method won't give you the expected 
       // result. 

     frame.size = calcSize; 
     frame.size.height += 0; // calcSize might be not pixel-precise, 
           // so add here additional padding pixels 
     UITextView * tmpTextView = [[UITextView alloc]initWithFrame:frame]; 

     // do whatever adjustments 
     tmpTextView.backgroundColor = [UIColor blueColor]; // show area explicitly (dev 
                  // purpose) 
     self.myTextView = tmpTextView; 
     self.myTextView.editable = NO; 
     self.myTextView.scrollEnabled = NO; 
     self.myTextView.multipleTouchEnabled = NO; 
     self.myTextView.userInteractionEnabled = NO; // pass on events to parentview 
     self.myTextView.font = [UIFont systemFontOfSize:13.0]; 
     [tmpTextView release]; 
     [self.scrollView addSubview:self.myTextView]; 
} 

... 

- (void)scrollViewDidScroll:(UIScrollView *)sender { 
    // for simplicity text is repeated again, of course it can be a member var/etc... 
    NSString * text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
          Nunc semper lacus quis erat. Cras sapien magna, porta non, 
          suscipit nec, egestas in, arcu. Maecenas sit amet est. 
          Quisque felis risus, tempor eu, dictum ac, volutpat id, 
          libero. Ut gravida, purus vitae interdum elementum, tortor 
          justo porttitor nisi, id rhoncus massa."; 
    self.myTextView.text = text; // assign value within this method and it is 
           // painted as expected. 
    } 

Комментарий:

Я настроил исходный фрагмент кода с типовыми namings и ценности, очевидно. Надеюсь, нет опечатки. Тем не менее, код содержит также расчет требуемой высоты кадра для текста, если значение текста может измениться и, следовательно, потребует разных размеров кадра.

Размещение фактического назначения текстового значения в методе scrollViewDidScroll работало для меня без каких-либо вспышек во время прокрутки и т. Д. (Пока что только тестировалось в iPhone Simulator).

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

0

Проблема, вероятно, будет следующей UIScrollViews.

Я думаю, что есть три решения:

  • Включение и отключение userInteractionEnabled, как выбираются различные элементы управления.
  • Предполагая, что текст является статическим, используйте UILabel вместо UITextView (UILabel не подкласс UIScrollView)
  • Реализовать свой собственный вид и сделать текст самостоятельно в сообщении DrawRect, а не полагаться на UITextView.
1

Возможно, у вас возникла проблема, когда UITextView не обновляется должным образом при прокрутке с экрана на экранную область.

Проверьте раздел «Offscreen UITextViews не обновляет правильно» эту страницу: Multiple Virtual Pages in a UIScrollView

Решение я использовал, чтобы заставить перерисовать взгляды прокрутки, когда они начинают появляться на экране. Это полная неприятность, но она устраняет проблему.

7

Я решил проблему принуждая «фальшивый» пролистайте:

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

Мое решение этой проблемы было по-другому:. Он работал только тогда, когда я установил свойство «AUTORESIZE подвиды» в UIScrollView на офф