텍스트보기에서 HTML 텍스트를 어떻게 표시 할 수 있습니까?
예를 들면
string <h1>Krupal testing <span style="font-weight:
bold;">Customer WYWO</span></h1>
텍스트가 굵게 표시되어 textview에 굵은 문자열로 표시되지만 일반 텍스트를 표시하고 싶다고 가정합니다. iPhone SDK에서 가능합니까?
답변:
iOS 5에서 UIWebView를 사용합니다.
iOS 6 이상에서는을 사용할 수 있습니다 . 방법 UITextView.attributedString
은 https://stackoverflow.com/a/20996085 를 참조 하세요 .
도 있습니다 문서화되지 않은 -[UITextView setContentToHTMLString:]
방법. AppStore에 제출하려면 이것을 사용하지 마십시오.
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;
NSAttributedString
에 NSMutableAttributedString
추가합니다[attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
대한 스위프트 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
let path = Bundle.main.path(forResource: "styles", ofType: "css")
는 콘텐츠를 let content = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8)
하고, HTML 문자열에 추가
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;
OHAttributedLabel 클래스를 살펴볼 수 있습니다.이 클래스를 사용하여 textField에서 이러한 종류의 문제를 극복했습니다. 여기에서 필요한 스타일을 얻기 위해 drawRect 메서드를 재정의했습니다.
첫 번째 응답은 iOS 7이 공통 컨트롤에 속성 문자열을 표시하기위한 명시적인 지원을 도입하기 전에 만들어졌습니다. 당신은 지금 설정할 수 attributedText
의 UITextView
를 NSAttributedString
사용하여 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에서 문자열을 기인하는 클래스를 제공한다.
대답은 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
NSUnicodeStringEncoding
NSString은 UTF8이 아니라 유니 코드로 인코딩되기 때문에 정확합니다. CJK 캐릭터의 경우 정답이 나오지 않습니다.
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
어떤 경우에는 UIWebView가 좋은 솔루션입니다. 때문에:
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)
}
한 가지 더 방법을 사용할 수도 있습니다. Three20 라이브러리는 스타일이 지정된 textView를 구성 할 수있는 방법을 제공합니다. 여기에서 라이브러리를 얻을 수 있습니다 : http://github.com/facebook/three20/
TTStyledTextLabel 클래스에는 textFromXHTML이라는 메서드가 있습니다. 이것이 목적에 부합 할 것 같습니다. 그러나 읽기 전용 모드에서는 가능합니다. HTML 콘텐츠를 작성하거나 편집 할 수 없다고 생각합니다.
이와 관련하여 도움이 될 수있는 질문도 있습니다. UILabel 및 TextView에 대한 HTML 문자열 콘텐츠
도움이 되었기를 바랍니다.