滚动到视图时菜单的屏幕外文本出现延迟 - WebView 问题? (iOS)

Posted

技术标签:

【中文标题】滚动到视图时菜单的屏幕外文本出现延迟 - WebView 问题? (iOS)【英文标题】:Offscreen Text of menu experiences delay when scrolled into view - WebView issue ? (iOS) 【发布时间】:2011-08-12 05:31:20 【问题描述】:

我的 ios 应用中有一个大的向下钻取菜单。 菜单内容源自 XML。 它存储在 SQLite 数据库中,并且正在使用 Webview。 为什么要使用 Webview?因为文本具有样式(字体大小/颜色)。

问题是:当您向下滚动菜单时,之前在屏幕外的文本栏会在 1/2 秒内保持不可见状态。他们需要一段时间来加载。然后你再次向上滚动,被移出屏幕的最上面的项目现在也需要一些时间才能出现。

在使用 WebView 时,有没有办法提高这种性能?有没有办法消除这种视觉加载时间?有没有我们应该考虑的方法?谢谢你的帮助。

【问题讨论】:

【参考方案1】:

您是否将 Web 视图放入 UITableView 中?你真的不能那样做;他们会互相争斗(这被明确记录为不支持)。

有两种主要的解决方案:将程序的这一部分重新设计为 Web 应用程序,或者使用 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(今天刚刚完成该章)。但是对于简单的东西,只要你不需要剪切和粘贴,以上就足够了。

【讨论】:

非常感谢罗布。我们将对此进行调查。即使有一个非常大的向下钻取菜单,您认为 Core Text 方法是否可行,这是什么?我预计源 XML 将是 10MB。 Core Text 是 Cocoa 中最底层的文本布局引擎。这是目前最快的系统。对于我认为可以很好地解决此问题的方法,请参阅github.com/Cocoanetics/NSAttributedString-Additions-for-html

以上是关于滚动到视图时菜单的屏幕外文本出现延迟 - WebView 问题? (iOS)的主要内容,如果未能解决你的问题,请参考以下文章

滚动到滚动视图/滚动视图中的特定文本字段 当键盘在屏幕上时停止滚动

iPad Safari 滚动会导致 HTML 元素消失并延迟重新出现

防止屏幕外的div调整大小

当键盘出现时视图仅大于屏幕时,如何在 iOS 中滚动?

表视图单元格仅在屏幕外时自动布局

Flex Mobile textInput 滚动文本滞后