我的iOS应用中有一个大型向下钻取菜单。 菜单内容源自XML。 它存储在SQLite数据库中,Webview正在使用中。 为什么要使用Webview?因为文本有样式(字体大小/颜色)。
问题在于:向下滚动菜单时,之前屏幕外的文本栏在1/2秒内保持不可见状态。他们需要一段时间才能加载。然后再次向上滚动,移出屏幕的顶部项目现在也需要时间。
使用WebView时,有没有办法提高性能?无论如何要消除这种视觉加载时间?我们应该考虑哪些方法?谢谢你的帮助。
答案 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(今天只完成那一章)。但是对于简单的东西,上面就足够了,只要你不需要剪切和粘贴。