uitextview에 html 텍스트 표시


84

텍스트보기에서 HTML 텍스트를 어떻게 표시 할 수 있습니까?

예를 들면

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

텍스트가 굵게 표시되어 textview에 굵은 문자열로 표시되지만 일반 텍스트를 표시하고 싶다고 가정합니다. iPhone SDK에서 가능합니까?

답변:


53

iOS 5에서 UIWebView를 사용합니다.

iOS 6 이상에서는을 사용할 수 있습니다 . 방법 UITextView.attributedStringhttps://stackoverflow.com/a/20996085 를 참조 하세요 .


도 있습니다 문서화되지 않은 -[UITextView setContentToHTMLString:] 방법. AppStore에 제출하려면 이것을 사용하지 마십시오.


48
문서화되지 않은 방법을 사용하면 앱이 거부됩니다 .......... 이미 경험했습니다.
Satyam

이 방법은 iOS 7에서 아직 문서화되지 않았습니까?
Ajeet 2013 년

1
@Ajeet developer.apple.com 에서 찾을 수 없다면 문서화되지 않은 것입니다.
kennytm

1
안녕하세요, 텍스트보기의 높이를 계산하는 방법은 무엇입니까? 텍스트보기가 스크롤되는 것을 원하지 않습니다. textView.contensize를 사용했습니다. 작동하지 않았습니다.
Durgaprasad 2014 년

1
효과가있다. 하지만 HTML 테이블 내용도 표시해야합니다. 시도했을 때 <th> 태그의 내용 만 표시됩니다. HTML 표 내용을 표시하는 방법은 무엇입니까?
Thamarai T

233

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
안녕하세요, 텍스트보기의 높이를 계산하는 방법은 무엇입니까? 텍스트보기가 스크롤되는 것을 원하지 않습니다. textView.contensize를 사용했습니다. 작동하지 않았습니다.
Durgaprasad 2014 년

6
문자열의 글꼴을 어떻게 변경할 수 있습니까? addAttribute : NSFontAttributeName을 사용하면 모든 글꼴 (굵게)이 재설정되는 것 같습니다.
jeswang 2014-08-08

15
글꼴 변경을 변경하려면 NSAttributedStringNSMutableAttributedString추가합니다[attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
Ajumal

1
자동 크기 조정 tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
Gaston Morixe 2015-07-31

1
: @Durgaprasad는 변경 가능한 사본을 작성하고 당신의 속성을 설정할 수 있습니다 문자열의 스타일을 수정NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
사운드 블래스터

50

대한 스위프트 4 , : 스위프트 4.2스위프트 (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

대한 스위프트 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

HTML을 문자열 @pableiros 때문에 외부 CSS를 추가 할 수있는 방법이 있나요
Mansuu은 ....

: @Mansuu .... 당신은 번들에서 CSS 파일을 읽을 필요 let path = Bundle.main.path(forResource: "styles", ofType: "css")는 콘텐츠를 let content = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8)하고, HTML 문자열에 추가
pableiros

감사합니다 @pableiros 작동했지만 내가 원하는 방식은 아닙니다. 내 외부 CSS는 bootstrap.min.css를 가져옵니다. 콘텐츠를 가져 와서 UItextView에 CSS를 적용하면 작동하지 않습니다.
만수 ....

빠른 3 :) 계속 유지하십시오.
아 므르 화가

19

BHUPI의 대답은 정확하지만 UILabel 또는 UITextView의 사용자 정의 글꼴을 HTML 콘텐츠와 결합하려면 html을 약간 수정해야합니다.

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;

아래 그림에서 차이점을 볼 수 있습니다. 여기에 이미지 설명 입력


1
여기에 Apple의 시스템 글꼴을 넣을 수 있습니까?
coolcool1994

외부 CSS를 추가하고 싶습니다. 어떻게해야합니까? @ 데이비드
Mansuu ....


9

첫 번째 응답은 iOS 7이 공통 컨트롤에 속성 문자열을 표시하기위한 명시적인 지원을 도입하기 전에 만들어졌습니다. 당신은 지금 설정할 수 attributedTextUITextViewNSAttributedString사용하여 HTML 내용에서 만든 :

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

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

역사를 위해 보존 된 원래 답변 :

를 사용하지 않는 한 UIWebView솔루션은 CoreText. ElanthiraiyanS가 지적했듯이 리치 텍스트 렌더링을 단순화하기 위해 일부 오픈 소스 프로젝트가 등장했습니다. 내가 추천 할 것입니다 NSAttributedString은-추가를 위해 HTML ( 편집 : 이 프로젝트는 대체 된 DTCoreText를 ) 생성 및 디스플레이가 HTML에서 문자열을 기인하는 클래스를 제공한다.


4

대답은 BHUPI에서 나에게 적합합니다.

코드는 아래와 같이 신속하게 전송됩니다.

"allowLossyConversion : false"에 주의 하십시오.

값을 true로 설정하면 순수한 텍스트가 표시됩니다.

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
NSUnicodeStringEncodingNSString은 UTF8이 아니라 유니 코드로 인코딩되기 때문에 정확합니다. CJK 캐릭터의 경우 정답이 나오지 않습니다.
DawnSong

3

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

1

어떤 경우에는 UIWebView가 좋은 솔루션입니다. 때문에:

  • 테이블, 이미지, 기타 파일을 표시합니다.
  • 빠르다 (NSAttributedString과 비교 : NSHTMLTextDocumentType)
  • 그것은 상자 밖으로

html이 복잡하거나 테이블이 포함 된 경우 NSAttributedString을 사용하면 충돌이 발생할 수 있습니다 ( )

웹보기에 텍스트를로드하려면 다음 스 니펫을 사용할 수 있습니다 (예제).

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

한 가지 더 방법을 사용할 수도 있습니다. Three20 라이브러리는 스타일이 지정된 textView를 구성 할 수있는 방법을 제공합니다. 여기에서 라이브러리를 얻을 수 있습니다 : http://github.com/facebook/three20/

TTStyledTextLabel 클래스에는 textFromXHTML이라는 메서드가 있습니다. 이것이 목적에 부합 할 것 같습니다. 그러나 읽기 전용 모드에서는 가능합니다. HTML 콘텐츠를 작성하거나 편집 할 수 없다고 생각합니다.

이와 관련하여 도움이 될 수있는 질문도 있습니다. UILabel 및 TextView에 대한 HTML 문자열 콘텐츠

도움이 되었기를 바랍니다.


-3

NSDoc은 문자열의 텍스트 파일을 html 파일에 저장 한 다음 UITextView와 동일한 위치에있는 웹뷰에 동시에로드합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.