문제

HTML 인 텍스트가있는 테이블을 만들기 때문에 UIWebView를 사용자 정의 테이블 셀의 서브 뷰로 사용하고 있습니다. 나는 이미 하나의 문제를 일으켰다 - 테이블에서 아래로 스크롤하면 UiwebViews가 초로 시간이 걸릴 것이다. 예를 들어, 나는 1, 2 및 3의 행으로 셀을보고있을 것입니다. 나는 8, 9 및 10으로 아래로 스크롤 할 것입니다. 셀 #1의 내용, 셀 #9의 내용은 셀 #2 등의 내용이었습니다.

문제는 Uiwebviews가 단순히 텍스트를 천천히 렌더링한다는 것임을 알게되었습니다. 대신 테이블이 CellForseAtIndexPath를받을 때까지 기다리지 않고 가능한 빨리 컨텐츠를 UIWebView에 예압하는 것이 좋습니다. 그래서 이제는 웹 뷰의 텍스트 내용을 가지고있는 도메인 객체가 있지만 실제로는 Uiwebview 자체에 대한 참조가 있습니다.

그러나 이제 Uiwebview의 일부 내용은 렌더링되고 테이블을 스크롤하면 Uiwebview는 회색 상자로만 표시됩니다. 회색 상자를 터치하면 실제로 터치를 받고 WebView를 업데이트합니다. 예를 들어 링크를 터치하면 (상자가 회색이고 운이 좋기 때문에 할 수도 있고 그렇지 않을 수도 있습니다), 운이 좋을 것입니다), 링크 된 페이지가 요청되고 제대로 표시됩니다.

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
            // I suppose this isn't necessary since I am just getting it from the
            // Domain Object anyway
    content = [[UIWebView alloc] initWithFrame:CGRectZero];
    content.backgroundColor = [UIColor blackColor];
    [self addSubview:content];
    [content release];
}
return self;
}

// called by cellForRowAtIndexPath 
- (void)setMyDomainObject:(MyDomainObject*)anObject {
UIWebView *contentWebView = anObject.contentWebView;
int contentIndex = [self.subviews indexOfObject:content];
[self insertSubview:contentWebView atIndex:contentIndex];
}
도움이 되었습니까?

해결책

이것을 다루는 한 가지 방법은 각각 다른 글꼴을 가진 여러 uilabel을 사용하는 것입니다. 그런 다음 전략적으로 셀 내에 배치하여 연속 텍스트처럼 보이게합니다. 나는 이것을 매우 좋은 결과로 uitable view에서 수행하는 것을 보았습니다.

또 다른 성능 문제는 UTIBLEVIEWCELL을 지나치게 과도한 방법이며 Init Method입니다. 이것은 거의 항상 uitable 뷰에서 성능이 저하됩니다. 대신 일반 uitableViewCell 인스턴스를 사용하고 ContentView에 서브 뷰를 추가하십시오.

이것은 Matt Gallagher 's에 의해 광범위하게 다루어졌습니다 쉬운 사용자 정의 UitableView 드로잉.

설명 된 또 다른 방법은 Three20을 사용하여 스타일의 텍스트를 제공 할 수 있습니다.

현재 시도하고있는 것은 UIWebView로 수행 할 수 없습니다.

프리로드는 도움이되지 않습니다 : UIWebViews가 화면에서 렌더링 될 때 UI 속도가 느려집니다. 항상 iPhone에서 게으른로드를 연습해야합니다.

Uiwebviews를 uitableview에 넣으면 잠재적으로 받아 들일 수없는 성능이 닿을 것입니다. 목표를 달성하기 위해 다른 수단을 사용해야합니다.

불행히도, NSattriptedString은 Uikit에서 사용할 수 없으므로 문제를 쉽게 해결할 수 있습니다.

다른 팁

그래서 여기에 내 업데이트 된 답변이 있습니다 : 나는 하나의 큰 uiwebview를 사용하여 테이블을 구현하여 스타일의 텍스트를 내 트위터 클라이언트 앱에 넣었습니다. Heltweetica (소스 사용 가능). HTML 및 CSS에서 레이아웃을 수행하는 방법을 이해하는 한 꽤 잘 작동합니다.

당신은 그냥 만듭니다 NSMutableString 문서를 구성하는 HTML 라인을 추가하십시오. 앱 샌드 박스에있는 CSS 파일과 같은 외부 파일을 참조 할 수 있습니다. 웹보기 대의원이 가로 채고 처리 할 수있는 "YourAction : //file.txt"와 같은 사용자 정의 URL 작업을 설정할 수 있습니다. IBAction에스:

- (void) refreshWebView {
    TwitterAccount *account = [twitter currentAccount];
    NSMutableString *html = [[NSMutableString alloc] init];
    // Open html and head tags
    [html appendString:@"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"];
    [html appendString:@"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"];
    [html appendString:@"<head>\n"];
    [html appendString:@"<meta name='viewport' content='width=device-width' />"];
    [html appendString:@"<link href='style-ipad.css' rel='styleSheet' type='text/css' />"];
    [html appendString:@"<script language='JavaScript' src='functions.js'></script>"];

    // Body
    [html appendString:@"</head><body><div class='artboard'>"];

    // [...]

    // Close artboard div, body. and html tags
    [html appendString:@"</div></body></html>\n"];

    NSURL *baseURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]];
    [self.webView loadHTMLString:html baseURL:baseURL];
    [html release];
}

JavaScript를 사용하여 페이지의 일부를 다시로드 할 수 있습니다.

- (void) refreshTabArea {
    NSString *html = [self stringByEscapingQuotes: [self tabAreaHTML]];
    NSString *js = [NSString stringWithFormat: @"document.getElementById(\"tab_area\").innerHTML = \"%@\";", html];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}

웹보기의 내용이 스타일링 된 텍스트 또는 하이퍼 링크로 제한되면 Three20 프로젝트를 살펴 보겠습니다. http://github.com/joehewitt/three20/tree/master

그것의 TTStyledText 클래스는 지원합니다 <b>, <i>, <img>, and <a> 내용의 태그. 아마도 WebViews보다 가벼운 것일 것입니다.

이것은 원래의 질문에 대답하지 않지만 한 걸음 물러서서 더 큰 그림을 보면 테이블 셀에 하이퍼 링크를 표시하려는 경우 클릭하면 웹 브라우저를 열면 의미가 있습니까? 테이블 셀에 링크를 힌트하거나 힌트를주는 스타일의 텍스트를 보여주지 만 링크를 탭할 수있는 전체 화면 웹보기가있는 별도의 화면을 열면 동일합니까?

당신은 'setrowatindexpath에 의해 호출'이라고 말하면, 당신은 행이 보이고 셀을 만들어야 할 때 호출되는 Uitableview 메소드 인 'cellforyatindexpath'를 의미 할 수 있습니다. 이 방법에서 셀 내용을 올바르게 초기화하고 업데이트하고 있는지 확인하십시오.

테이블 셀 서브 클래스에서 -prepareforreuse 메소드를 우선적으로 살펴 보셨습니까? 스크롤시 셀이 업데이트되지 않는 경우 재사용 가능한 셀의 내용이 지워지지 않을 수 있습니다.

내 이해는 viewDidLoad ()가 발생한 후에로드를 시작하지 않으면 웹 뷰가 렌더링되지 않는다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top