16

HTML のテキストを含むテーブルを作成しているので、カスタム テーブル セルのサブビューとして UIWebView を使用しています。私はすでに 1 つの問題に遭遇しました。テーブルを下にスクロールすると、UIWebViews の更新に 1 秒かかります。たとえば、1、2、3 番目の行のセルを表示しているとします。下にスクロールして、8、9、10 と表示します。しばらくの間、セル #8 に表示されていた UIWebView のコンテンツは次のようになりました。セル #1 の内容、セル #9 の内容はセル #2 の内容、というように続きます。

問題は、UIWebViews が単にテキストをゆっくりとレンダリングすることであることがわかりました。テーブルがcellForRowAtIndexPathを受け取るまで待つのではなく、できるだけ早くコンテンツをUIWebViewにプリロードすることをお勧めします。これで、以前は WebView のテキスト コンテンツを持っていたドメイン オブジェクトがありますが、実際には UIWebView 自体への参照を持っています。

しかし、UIWebView のコンテンツの一部がレンダリングされ、テーブルをスクロールすると、UIWebView は灰色のボックスとしてのみ表示されます。灰色のボックスに触れると、実際にタッチを受け取り、WebView を更新します。リンク先のページがリクエストされ、適切に表示されます。

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
            // I suppose this isn't necessary since I am just getting it from the
            // Domain Object anyway
    content = [[UIWebView alloc] initWithFrame:CGRectZero];
    content.backgroundColor = [UIColor blackColor];
    [self addSubview:content];
    [content release];
}
return self;
}

// called by cellForRowAtIndexPath 
- (void)setMyDomainObject:(MyDomainObject*)anObject {
UIWebView *contentWebView = anObject.contentWebView;
int contentIndex = [self.subviews indexOfObject:content];
[self insertSubview:contentWebView atIndex:contentIndex];
}
4

7 に答える 7

9

これに対処する 1 つの方法は、それぞれ異なるフォントを持つ複数の UILabel を使用することです。次に、戦略的にそれらをセル内に配置して、連続したテキストのように見せます。これが UITableView で行われ、非常に良い結果が得られるのを見てきました。

別のパフォーマンスの問題は、UItableViewCell とその init メソッドをオーバーライドしている可能性があります。これにより、ほとんどの場合、UITableView のパフォーマンスが低下します。代わりに、通常の UITableViewCell インスタンスを使用して、その contentView にサブビューを追加します。

これは Matt Gallagher のEasy Custom UITableView Drawingで広くカバーされています。

説明されている別の方法は、スタイル付きテキストも提供できる Three20 を使用することでした。

現在試みていることは、UIWebview では実行できません。

プリロードは役に立ちません。これにより、UIWebviews がオフスクリーンでレンダリングされているときに UI の速度が低下します。iPhone では常に遅延読み込みを練習する必要があります。

UIWebviews を UITableView に配置すると、許容できないパフォーマンス ヒットが発生する可能性があります。目標を達成するには、他の手段を使用する必要があります。

残念ながら、UIKit では NSAttributedString を使用できないため、問題を簡単に解決できます。

于 2009-05-30T05:59:28.203 に答える
6

これが私の最新の答えです。1つの大きな UIWebView を使用してテーブルを実装し、自分のTwitterクライアントアプリであるHelTweetica(ソースが利用可能)のテーブルセル内にスタイル付きテキストを配置しました. HTML と CSS でレイアウトを行う方法を理解している限り、かなりうまく機能します。

NSMutableStringドキュメントを構成する HTML の行を作成して追加するだけです。アプリのサンドボックスにある CSS ファイルなどの外部ファイルを参照できます。「youraction://file.txt」などのカスタム URL アクションを設定して、Web ビュー デリゲートがインターセプトし、代わりに処理できるようにすることができますIBAction

- (void) refreshWebView {
    TwitterAccount *account = [twitter currentAccount];
    NSMutableString *html = [[NSMutableString alloc] init];
    // Open html and head tags
    [html appendString:@"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"];
    [html appendString:@"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"];
    [html appendString:@"<head>\n"];
    [html appendString:@"<meta name='viewport' content='width=device-width' />"];
    [html appendString:@"<link href='style-ipad.css' rel='styleSheet' type='text/css' />"];
    [html appendString:@"<script language='JavaScript' src='functions.js'></script>"];

    // Body
    [html appendString:@"</head><body><div class='artboard'>"];

    // [...]

    // Close artboard div, body. and html tags
    [html appendString:@"</div></body></html>\n"];

    NSURL *baseURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]];
    [self.webView loadHTMLString:html baseURL:baseURL];
    [html release];
}

また、JavaScript を使用してページの一部をリロードできます。

- (void) refreshTabArea {
    NSString *html = [self stringByEscapingQuotes: [self tabAreaHTML]];
    NSString *js = [NSString stringWithFormat: @"document.getElementById(\"tab_area\").innerHTML = \"%@\";", html];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}
于 2010-04-28T19:27:28.607 に答える
4

Web ビューのコンテンツがスタイル付きテキストまたはハイパーリンクに制限されている場合は、Three20 プロジェクトを参照してください: http://github.com/joehewitt/three20/tree/master

そのTTStyledTextクラスは<b>, <i>, <img>, and <a>、コンテンツ内のタグをサポートしています。おそらく、webviews よりも軽量です。

于 2009-05-27T19:03:40.807 に答える
2

これは元の質問への回答ではありませんが、一歩下がって全体像を見ると、表のセルにハイパーリンクを表示しようとしている場合、それをクリックすると Web ブラウザーが開くということですか? リンクのように見える、またはリンクを示唆するスタイル付きのテキストを表のセルに表示し、リンクをタップできるフルスクリーンの Web ビューで別の画面を開いた場合も同じでしょうか?

于 2009-03-20T21:38:10.700 に答える
1

「setRowAtIndexPath によって呼び出される」と言ったのは、行が表示され、セルを作成する必要があるときに呼び出される UITableView メソッドである「cellForRowAtIndexPath」を意味する場合があります。このメソッドで、セルの内容を適切に初期化および更新していることを確認してください。

于 2009-03-16T04:43:21.420 に答える
0

私の理解では、viewDidLoad()が発生した後にロードを開始しない限り、WebViewはレンダリングされません。

于 2010-04-27T19:04:54.193 に答える
0

テーブルセルのサブクラスで -prepareForReuse メソッドをオーバーライドすることを検討しましたか? スクロールしてもセルが更新されないように見える場合は、再利用可能なセルの内容がクリアおよびリセットされていない可能性があります。

于 2009-03-14T23:24:47.123 に答える