//-------------------------------------------------------------------

// 문제의 시작

//-------------------------------------------------------------------

html 태그를 포함한 문자열을

UIWebview를 이용해서 화면에 보여주고

내용에 따라서 webview의 높이를 동적으로 바꿔주고 있었다.


webViewDidFinishLoad 메소드에서

NSString* s = [webview stringByEvaluatingJavaScriptFromString:@"document.documentElement.offsetHeight"];

s.floatValue;

이런식으로 내용의 높이를 구했었음


그런데 이번에 새로 출시한 iphone Xs Max 기종에서

webview의 높이가 비정상적으로 나오는 오류가 발견되었다.


사실 webview가 일반적인 상황에서는 높이를 정상적으로 주는데.

나의 경우는 UITableviewCell 안에 webview가 있어서

실제 webview가 렌더링 되지 전에는 높이가 정확히 구해지지 않는것이다.

(webview가 렌더링 되기 전에. tableviewcell 이 자체적으로 높이를 구해야 하는 상황임)


6시간동안 이런 저런 방법을 시도해봤지만 모두 실패.

죄절.


안드로이드 개발자에게 이런 현상을 이야기 하니

자기는 웹뷰를 안쓰고 textview에 html내용을 보여주고 있다고 한다.

혹시나 하고 찾아보니 ios도 UITextview에도 html을 보여줄수 있군. ㅎㅎㅎ

간단한 방법이라 금방 했다.


//-------------------------------------------------------------------

// li 태그의 bullet 간격 문제

//-------------------------------------------------------------------

잘 되는데.

html 안에 있는 css 스타일이 UITextview에서는 전혀 적용되지 않아서.

html 내의 ul, li 태그가 UITextview에서 보일때

동그라미 (bullet) 좌우의 간격이 너무 크게 나온다.

어찌 어찌 NSMutableParagraphStyle 까지 수정해서 이쁘게 보이도록 수정완료.

아래는 최종 함수.



/**

 * UITextView에 html을 보여준다.

 */

+ (void)doMakeHtmlText:(UITextView*)tv :(NSString*)s

{

  NSMutableAttributedString* aString = [[NSMutableAttributedString alloc] initWithData:[s dataUsingEncoding:NSUnicodeStringEncoding]

                                                                               options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }

                                                                    documentAttributes:nil

                                                                                 error:nil];

  

  // li bullet 좌우의 간격이 너무 커서, 스페이스 한칸으로 줄인다.

  [aString.mutableString replaceOccurrencesOfString:@"\t" withString:@" " options:0 range:NSMakeRange(0, aString.mutableString.length)];


  [aString enumerateAttribute:NSParagraphStyleAttributeName inRange:NSMakeRange(0, aString.length) options:0 usingBlock:^(id  _Nullable value, NSRange range, BOOL * _Nonnull stop) {    


    // li 때문에 들여쓰기 되었다면. 들여쓰기 간격을 줄인다.

    // 왜냐면. 위에서 \t 를 스페이스 한카능로 바꿨기 때문에

    if(((NSMutableParagraphStyle*)value).headIndent == 36)

    {

      ((NSMutableParagraphStyle*)value).headIndent = 10;

    }

    

    ((NSMutableParagraphStyle*)value).lineSpacing = 4;

  }];


  //NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];

  //paragraphStyle.paragraphSpacing = 0;

  //paragraphStyle.firstLineHeadIndent = 0;

  //paragraphStyle.lineSpacing = 4;

  //paragraphStyle.headIndent = 20; // 각 줄의 왼쪽 공간.

  //paragraphStyle.defaultTabInterval = 10;

  //paragraphStyle.tabStops = @[[[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentLeft location:0 options:@{}]]; // li (bullet)의 왼쪽 공간. 양수만 적용됨

  //[aString addAttributes:@{NSParagraphStyleAttributeName:paragraphStyle}

  //                 range:NSMakeRange(0,aString.length)];

  tv.attributedText = aString;

  tv.textContainerInset = UIEdgeInsetsZero;

  tv.scrollEnabled = false;

}




* 수정전 이미지 (li의 bullet 좌우 여백이 너무 큼)





* 수정후 이미지 (li의 bullet 좌우 여백이 적당함)





반응형
Posted by 돌비
,