2010-08-27 10 views
7

Tôi có một số văn bản cần được hiển thị trong ứng dụng của tôi. Văn bản chứa các liên kết cần tương tác. Tôi đã thử một vài giải pháp để tạo liên kết có thể nhấn vào trong UITextViewsUILabels.Tự động định kích thước một UIWebView dựa trên kích thước phông chữ nội dung

  1. UITextView liên kết

    • UITextView cung cấp máy dò dữ liệu mà nhặt trên URL và làm cho họ tappable.
    • Không thể sử dụng được với tôi vì liên kết sẽ chỉ mở ra bên ngoài trong Safari, không có cách nào kiểm soát và làm những gì tôi muốn với liên kết.
  2. UILabel liên kết sử dụng "Nhãn Fancy" (http://furbo.org/2008/10/07/fancy-uilabels/)

    • Hầu hết các giải pháp hoàn hảo, cung cấp phát hiện các liên kết và một cách để người dùng xem và khai thác chúng nội tuyến và đem lại cho tôi toàn quyền điều khiển phải làm gì với một liên kết khi nó được nhấn.
    • Hiện không sử dụng được vì việc triển khai sử dụng UIButton s để che phủ các liên kết và chúng không được bao bọc bằng văn bản trên các liên kết dài.

Cuối cùng tôi đã quyết định sử dụng chế độ xem web. Tôi chuyển văn bản vào webview và xây dựng một trình bao bọc HTML cơ bản xung quanh nó và mọi thứ đều hunky-dory. Đây là phương pháp tương tự mà Twitter cho iPhone (hay còn gọi là Tweetie) sử dụng.

Vấn đề duy nhất tôi có bây giờ là nếu văn bản quá dài, thì webview sẽ nén luồng và cuộn để xem văn bản được cắt bớt. Thứ hai nếu văn bản quá ngắn, thì có một vùng không gian bị lãng phí lớn bên dưới chế độ xem web.

Không giống như Tweetie, tôi có nhiều nội dung hơn bên dưới chế độ xem web và tôi muốn tránh tràn hoặc không gian bị lãng phí. Chế độ xem web là một chế độ xem con của chế độ xem cuộn, vì vậy nội dung của toàn bộ trang có thể phát triển mà không có các bản xem trước cần phải cuộn.

Có cách nào tôi có thể tự động thay đổi kích thước chế độ xem web sao cho nó chỉ là chiều cao phù hợp dựa trên nội dung của nó?

Tôi đã thử nhiều điều cho đến nay, không có gì có vẻ là một giải pháp vững chắc:

  • sizeToFit không làm gì (hoặc nhiều khả năng, chỉ cần thiết lập kích thước với những gì khung hiện nay là anyway).
  • sizeThatFits: trả về kích thước hiện tại của nó.
  • NSString 's sizeWithFont:constrainedToSize: không khả thi vì UIWebViewUIFont có các biểu diễn khác nhau về kích thước 18 là bao nhiêu.
    • Chỉ cần xây dựng vào thời điểm này. Trong thử nghiệm của tôi, tôi đã tìm thấy rằng một webView với một scaleFactor là 1.0 và scalesPageToFit được đặt thành NO và kích thước phông chữ cho toàn bộ trang được 13.5pt (trong CSS) hiển thị văn bản có cùng kích thước với UILabel với UIFont kích thước 18. Nếu bất cứ ai có thể giải thích rằng tôi sẽ biết ơn.
  • Ngoài ra, trong webView tôi đang sử dụng thuộc tính CSS word-wrap: break-word; để ngăn webView di chuyển theo chiều ngang với các từ hoặc URL dài. Do đó, hành vi gói giữa webView và UILineBreakModeWordWrap hoàn toàn khác nhau. Ngay cả khi sử dụng UILineBreakModeCharacterWrap cũng không tạo ra kết quả tương tự.

Hoặc không có cách nào để làm điều này, hoặc tôi đang câm và thiếu cái gì đó đơn giản. Nếu bất cứ ai có thể cung cấp một số cái nhìn sâu sắc, tôi sẽ rất biết ơn. Cảm ơn.

Trả lời

1

Tôi tìm thấy một giải pháp cho vấn đề của tôi tại http://www.iphonedevsdk.com/forum/iphone-sdk-development/1388-getting-actual-content-size-uiwebview.html

Tôi không tin rằng đó là giải pháp tốt nhất, nhưng nó làm việc. Nếu bất cứ ai có bất kỳ ý tưởng tốt hơn, tôi sẽ rất vui khi nghe họ.

Tôi đã kết thúc chạy javascript trên webView của tôi trong webViewDidFinishLoad:. Tôi có một phần tử div đơn gói nội dung được gọi là cơ thể của tôi, do đó, mã của tôi trông giống như:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString *string = [_webView stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"body\").offsetHeight;"]; 
    CGFloat height = [string floatValue] + 8; 
    CGRect frame = [_webView frame]; 
    frame.size.height = height; 
    [_webView setFrame:frame]; 

    if ([[self delegate] respondsToSelector:@selector(webViewController:webViewDidResize:)]) 
    { 
     [[self delegate] webViewController:self webViewDidResize:frame.size]; 
    } 
} 

tôi phải pad chiều cao hơi như giá trị ban đầu đã không đưa vào tài khoản các kích thước lề vv

Sau khi tôi nhận được chiều cao, tôi gọi lại cho đại biểu của mình rằng webview đã thay đổi kích thước để bố cục có thể được thực hiện.

3

Thực ra, bạn có thể sử dụng -sizeThatFits: với một mẹo nhỏ. Xem my response cho một câu hỏi tương tự.

+0

Có vẻ tốt, tôi sẽ thử khi tôi cần làm điều này. – Jasarien