屏幕外滚动到视图时菜单体验延迟 - WebView问题? (IOS)

时间:2011-08-12 05:31:20

标签: ios sqlite menu webview loading

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

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

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

1 个答案:

答案 0 :(得分:0)

您是否将网络视图置于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(今天只完成那一章)。但是对于简单的东西,上面就足够了,只要你不需要剪切和粘贴。