Вне экрана Экран меню испытывает задержку при прокрутке в представлении - проблема WebView?(IOS) - PullRequest
1 голос
/ 12 августа 2011

У меня есть большое раскрывающееся меню в моем приложении для iOS. Содержание меню происходит из XML. Он хранится в базе данных SQLite, и в настоящее время используется Webview. Почему используется Webview? Потому что текст имеет стиль (размер шрифта / цвет).

Вот проблема: когда вы прокручиваете меню вниз, текстовые строки, которые ранее были за кадром, остаются невидимыми в течение 1/2 секунды. Они берут некоторое время, чтобы загрузить. И вы прокручиваете снова, верхние элементы, которые были перемещены за пределы экрана, теперь также требуют времени для появления.

Есть ли способ улучшить эту производительность при работе с WebView? Есть ли способ устранить это визуальное время загрузки? Есть ли подходы, которые мы должны рассмотреть? Спасибо за любую помощь.

1 Ответ

0 голосов
/ 31 августа 2011

Вы помещаете веб-представления в UITableView? Вы действительно не можете этого сделать; они будут сражаться друг с другом (и это явно задокументировано как не поддерживаемое).

Существует два основных решения: перепроектировать эту часть программы как веб-приложение или макет с помощью Core Text. Выполнение всей работы за один UIWebView намного быстрее, но требует перехода между JavaScript и Objective-C, который сложно разрабатывать и отлаживать. Если вы пойдете по этому пути, я обычно рекомендую вам создать часть JavaScript как «мини-приложение», которое можно разрабатывать и отлаживать в Safari, а затем вставлять в него.

Для простого макета Core Text не слишком сложен. Если вы создаете CFAttributedString, вот все, что вам нужно, чтобы нарисовать очень простую рамку:

- (id)initWithFrame:(CGRect)frame {
  if ((self = [super initWithFrame:frame])) {
    CGAffineTransform 
    transform = CGAffineTransformMakeScale(1, -1);
    CGAffineTransformTranslate(transform, 
                               0,
                               -self.bounds.size.height);
    self.transform = transform;
    self.backgroundColor = [UIColor whiteColor];
  }
  return self;
 }

- (void)drawRect:(CGRect)rect {
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSetTextMatrix(context, CGAffineTransformIdentity);

  CGPathRef path = CGPathCreateWithRect(self.bounds, NULL);

  CFAttributedStringRef
  attrString = (__bridge CFTypeRef)self.attributedString;

  // Create the framesetter using the attributed string
  CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);

  // Create a single frame using the entire string (CFRange(0,0))
  // that fits inside of path.
  CTFrameRef
  frame = CTFramesetterCreateFrame(framesetter,
                                   CFRangeMake(0, 0),
                                   path, 
                                   NULL);

  // Draw the frame into the current context
  CTFrameDraw(frame, context);

  CFRelease(frame);
  CFRelease(framesetter);
  CGPathRelease(path);
}

И требуемый плагин: Да, моя книга будет содержать более 20 страниц по всем видам причудливого текстового макета, в основном с использованием Core Text (только что завершил эту главу сегодня). Но для простых вещей достаточно вышеперечисленного, если вам не нужно вырезать и вставлять.

...