Hiển thị văn bản html trong uitextview


83

Làm cách nào để hiển thị văn bản HTML trong textview?

Ví dụ,

string <h1>Krupal testing <span style="font-weight:
bold;">Customer WYWO</span></h1>

Giả sử văn bản được in đậm để nó hiển thị trong textview dưới dạng chuỗi đậm nhưng tôi muốn hiển thị văn bản bình thường. Điều này có khả thi trong SDK iPhone không?

Câu trả lời:


53

Sử dụng UIWebView trên iOS 5-.

Trên iOS 6+, bạn có thể sử dụng UITextView.attributedString, hãy xem https://stackoverflow.com/a/20996085 để biết cách thực hiện.


Cũng có một phương pháp không có giấy tờ -[UITextView setContentToHTMLString:] . Không sử dụng điều này nếu bạn muốn gửi đến AppStore.


48
Ứng dụng sẽ bị từ chối vì sử dụng các phương pháp không có giấy tờ ......... Tôi đã trải nghiệm nó.
Satyam

có phải phương pháp này vẫn không có tài liệu trong ios 7?
Ajeet

1
@Ajeet Nếu bạn không thể tìm thấy nó trong developer.apple.com thì nó không có giấy tờ.
kennytm

1
Xin chào, Làm thế nào để tính toán chiều cao của chế độ xem văn bản? Tôi không muốn chế độ xem văn bản đang cuộn. Tôi đã sử dụng textView.contensize. Không hoạt động.
Durgaprasad

1
Nó hoạt động. Nhưng tôi cũng cần hiển thị nội dung bảng HTML. Khi tôi thử, nó chỉ hiển thị nội dung của thẻ <th>. Làm thế nào để hiển thị nội dung bảng HTML?
Thamarai T

233

Sử dụng khối mã sau cho ios 7+.

NSString *htmlString = @"<h1>Header</h1><h2>Subheader</h2><p>Some <em>text</em></p><img src='http://blogs.babble.com/famecrawler/files/2010/11/mickey_mouse-1097.jpg' width=70 height=100 />";
NSAttributedString *attributedString = [[NSAttributedString alloc]
          initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding]
               options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
    documentAttributes: nil
                 error: nil
];
textView.attributedText = attributedString;

7
Xin chào, Làm thế nào để tính toán chiều cao của chế độ xem văn bản? Tôi không muốn chế độ xem văn bản đang cuộn. Tôi đã sử dụng textView.contensize. Không hoạt động.
Durgaprasad

6
Làm cách nào để thay đổi phông chữ của chuỗi? Sử dụng addAttribute: NSFontAttributeName dường như đã đặt lại tất cả phông chữ (in đậm).
jeswang

15
Để thay đổi phông chữ, hãy thay đổi NSAttributedStringthành NSMutableAttributedStringvà thêm[attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
Ajumal

1
Automagically kích thước nó tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
Gaston Morixe

1
@Durgaprasad để thay đổi phong cách chuỗi của bạn có thể tạo bản sao có thể thay đổi và thiết lập các thuộc tính của bạn với nó:NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
Sound Blaster

48

Đối với Swift 4 , Swift 4.2:Swift 5

let htmlString = """
    <html>
        <head>
            <style>
                body {
                    background-color : rgb(230, 230, 230);
                    font-family      : 'Arial';
                    text-decoration  : none;
                }
            </style>
        </head>
        <body>
            <h1>A title</h1>
            <p>A paragraph</p>
            <b>bold text</b>
        </body>
    </html>
    """

let htmlData = NSString(string: htmlString).data(using: String.Encoding.unicode.rawValue)

let options = [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html]

let attributedString = try! NSAttributedString(data: htmlData!, options: options, documentAttributes: nil)

textView.attributedText = attributedString

Đối với Swift 3 :

let htmlString = """
    <html>
        <head>
            <style>
                body {
                    background-color : rgb(230, 230, 230);
                    font-family      : 'Arial';
                    text-decoration  : none;
                }
            </style>
        </head>
        <body>
            <h1>A title</h1>
            <p>A paragraph</p>
            <b>bold text</b>
        </body>
    </html>
    """

let htmlData = NSString(string: htmlString).data(using: String.Encoding.unicode.rawValue)

let attributedString = try! NSAttributedString(data: htmlData!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)

textView.attributedText = attributedString

Có cách nào để thêm css bên ngoài vào html được quy cho String @pableiros
Mansuu ....

@Mansuu .... Bạn phải đọc file css từ bó của bạn: let path = Bundle.main.path(forResource: "styles", ofType: "css"), có nội dung let content = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8)và thêm nó vào String html
pableiros

Cảm ơn @pableiros Nó đã hoạt động, nhưng không phải theo cách tôi muốn. Css bên ngoài của tôi nhập bootstrap.min.css. Nó không hoạt động khi tôi áp dụng css cho UItextView bằng cách lấy nội dung của nó.
Mansuu ....

thanks a lot nó làm việc cho tôi cho nhanh 3 :) giữ nó lên
Amr Angry

19

Câu trả lời của BHUPI là đúng, nhưng nếu bạn muốn kết hợp phông chữ tùy chỉnh của mình từ UILabel hoặc UITextView với nội dung HTML, bạn cần sửa lại html của mình một chút:

NSString *htmlString = @"<b>Bold</b><br><i>Italic</i><p> <del>Deleted</del><p>List<ul><li>Coffee</li><li type='square'>Tea</li></ul><br><a href='URL'>Link </a>";

htmlString = [htmlString stringByAppendingString:@"<style>body{font-family:'YOUR_FONT_HERE'; font-size:'SIZE';}</style>"];
/*Example:

 htmlString = [htmlString stringByAppendingString:[NSString stringWithFormat:@"<style>body{font-family: '%@'; font-size:%fpx;}</style>",_myLabel.font.fontName,_myLabel.font.pointSize]];
*/
 NSAttributedString *attributedString = [[NSAttributedString alloc]
                      initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding]
                           options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
                documentAttributes: nil
                             error: nil
            ];
textView.attributedText = attributedString;

Bạn có thể thấy sự khác biệt trên hình dưới đây: nhập mô tả hình ảnh ở đây


1
Bạn có thể đặt phông chữ hệ thống của Apple ở đây không?
coolcool1994

Tôi muốn thêm css bên ngoài, làm thế nào tôi có thể làm điều đó? @ David
Mansuu ....

12

Bạn có thể xem các lớp OHAttributedLabel, tôi đã sử dụng chúng để khắc phục loại vấn đề này với textField của mình. Trong đó, họ đã ghi đè phương thức drawRect để có được kiểu cần thiết.

https://github.com/AliSoftware/OHAttributedLabel


OHAttributedLabel có thể hiển thị các thẻ ul li như thế nào?
user2955351

9

Phản hồi đầu tiên của tôi được đưa ra trước khi iOS 7 giới thiệu hỗ trợ rõ ràng để hiển thị các chuỗi được phân bổ trong các điều khiển chung. Bây giờ bạn có thể thiết lập attributedTextcủa UITextViewmột NSAttributedStringtạo ra từ nội dung HTML sử dụng:

-(id)initWithData:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary **)dict error:(NSError **)error 

- initWithData: options: documentAttributes: error: (Apple Doc)

Câu trả lời ban đầu, được lưu giữ cho lịch sử:

Trừ khi bạn sử dụng a UIWebView, giải pháp của bạn sẽ dựa trực tiếp vào CoreText. Như ElanthiraiyanS đã chỉ ra, một số dự án mã nguồn mở đã xuất hiện để đơn giản hóa kết xuất văn bản đa dạng thức. Tôi muốn giới thiệu NSAttributedString-Additions-For-HTML ( Chỉnh sửa: dự án đã được thay thế bằng DTCoreText ), có các lớp để tạo và hiển thị các chuỗi được phân bổ từ HTML.


4

Câu trả lời đã phù hợp với tôi rằng từ BHUPI.

Quá trình chuyển mã nhanh chóng như sau:

Hãy chú ý "allowLossyConversion: false"

nếu bạn đặt giá trị thành true, nó sẽ hiển thị văn bản thuần túy.

let theString = "<h1>H1 title</h1><b>Logo</b><img src='http://www.aver.com/Images/Shared/logo-color.png'><br>~end~"

        let theAttributedString = try! NSAttributedString(data: theString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!,
            options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
            documentAttributes: nil)

        UITextView_Message.attributedText = theAttributedString

2
NSUnicodeStringEncodinglà đúng, vì NSString được mã hóa Unicode, không phải UTF8. Trong trường hợp ký tự CJK, bạn sẽ không nhận được câu trả lời đúng.
DawnSong

3

Đối với Swift3

    let theString = "<h1>H1 title</h1><b>Logo</b><img src='http://www.aver.com/Images/Shared/logo-color.png'><br>~end~"

    let theAttributedString = try! NSAttributedString(data: theString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!,
        options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil)

    UITextView_Message.attributedText = theAttributedString

0

Đối với một số trường hợp, UIWebView là một giải pháp tốt. Bởi vì:

  • nó hiển thị bảng, hình ảnh, các tệp khác
  • nó nhanh (so sánh với NSAttributedString: NSHTMLTextDocumentType)
  • nó ra khỏi hộp

Sử dụng NSAttributedString có thể dẫn đến sự cố, nếu html phức tạp hoặc chứa các bảng ( ví dụ như vậy )

Để tải văn bản vào chế độ xem web, bạn có thể sử dụng đoạn mã sau (chỉ là ví dụ):

func loadHTMLText(_ text: String?, font: UIFont) {
        let fontSize = font.pointSize * UIScreen.screens[0].scale
        let html = """
        <html><body><span style=\"font-family: \(font.fontName); font-size: \(fontSize)\; color: #112233">\(text ?? "")</span></body></html>
        """
        self.loadHTMLString(html, baseURL: nil)
    }

-2

Bạn cũng có thể sử dụng một cách nữa. Thư viện Three20 cung cấp một phương pháp mà qua đó chúng ta có thể tạo một textView theo kiểu. Bạn có thể lấy thư viện tại đây: http://github.com/facebook/three20/

Lớp TTStyledTextLabel có một phương thức được gọi là textFromXHTML: Tôi đoán điều này sẽ phục vụ mục đích. Nhưng nó sẽ có thể ở chế độ chỉ đọc. Tôi không nghĩ rằng nó sẽ cho phép viết hoặc chỉnh sửa nội dung HTML.

Cũng có một câu hỏi có thể giúp bạn về vấn đề này: Nội dung chuỗi HTML cho UILabel và TextView

Tôi hy vọng nó hữu ích.


-3

NSDoc lưu tệp văn bản trong một chuỗi vào tệp html, sau đó tải đồng thời nó vào chế độ xem web ở cùng vị trí với UITextView của bạn ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.