2011-10-18 4 views
2

위키 모바일 버전 웹 페이지를 UIPopoverController 내의 UIWebView로 열려고합니다. 문제는 내 contentSizeForViewInPopover 또는 UIWebView 프레임을 설정하는 방법과 상관없이 또는 단순히 UIWebView.scalesPageToFit = YES로 설정하는 것입니다. 위키 모바일 버전 페이지 콘텐츠 크기가 내 UIWebView보다 큰 것 같습니다. 그러나 iPhone에서 사용하면 문제가 없습니다. 여기에 팝 오버 컨트롤러에 대한 내 코드입니다 :위키 모바일 페이지를 UIPopoverController 내의 UIWebView에 표시합니다.

//create a UIWebView UIViewController first 
WikiViewController *addView = [[WikiViewController alloc] init]; 
addView.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0f); 

//then create my UIPopoverController 
popover = [[UIPopoverController alloc] initWithContentViewController:addView]; 
popover.delegate = self; 
[addView release]; 

//then get the popover rect 
CGPoint pointforPop = [self.mapView convertCoordinate:selectAnnotationCord 
             toPointToView:self.mapView]; 
CGRect askRect = CGRectMake((int)pointforPop.x, (int)pointforPop.y+10, 1.0, 1.0); 
[popover presentPopoverFromRect:askRect 
         inView:self.mapView 
     permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES]; 
[self.mapView deselectAnnotation:annotation animated:YES]; 

은이가있는 UIWebView를 만드는 방법에 대한 내 코드입니다 : 누군가가 나에게 도움이 되거 수 있다면

- (void)viewDidLoad 
{ 
wikiWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 480.0f)]; 
wikiWebView.scalesPageToFit = YES; 
//or No, doesn't matter, it all get larger than this 
wikiWebView.delegate = self; 
self.view = wikiWebView; 
} 

모든 코드는 일반적인 것 같다 ... 가 궁금, 정말 고맙습니다.

답변

2

아, 다른 품질 보증에서 html에 "width = device-width"라는 줄이 있고 popover 컨트롤러에서 webview를로드하는 경우이 팝 오버 컨트롤러가 자동으로보기 너비가 아닌 device-width를 보냅니다. 당신이 지정한, 그리고 못생긴하고 펑키보기를 확인하십시오. 그 게시물에서 jQuery 문제이며, jQuery 방식으로 해결했다. 내 문제는 위키 모바일 버전의 html 문제 일뿐입니다. 그래서 나는 다른 방법을 시도하지만 비슷합니다.

간단한 webViewdidload 대리자 메서드에 코드를 추가하고 NSString 인스턴스에 URL HTML을 가져온 다음 NSString 인스턴스 메서드를 사용하여로드 된 HTML에서 "device-width"를 검색하고 내 뷰 너비로 바꿔서 새로운 NSString, 다음이 새로운 NSString이 페이지를로드하십시오. 그게 다야.

- (void) webViewDidFinishLoad:(UIWebView *)webView 
{ 
if (!alreadyReload) 
{ 
    NSString *webHTML = [NSString stringWithContentsOfURL:webView.request.URL encoding:NSUTF8StringEncoding error:NULL]; 
    NSRange range = [webHTML rangeOfString:@"device-width"]; 
    if ((range.location!=NSNotFound)&&(range.length != 0)) 
    { 
     webHTML = [webHTML stringByReplacingOccurrencesOfString:@"device-width" withString:@"whatever width you need" options:0 range:range]; 
     [webView loadHTMLString:webHTML baseURL:wikiWebView.request.URL]; 
     alreadyReload = YES; 
    } 
} 
} 

이와 비슷한 내용입니다.

그런데 위키 모바일 버전에서만 사용하기 때문에 html은 간단하며 이러한 종류의 비교 및 ​​바꾸기는 매우 쉽습니다. 좀 더 일반적인 경우에 그것을 사용하고 싶다면 다른 방법을 사용할 수도 있습니다.

2

그것은 완전히로드 된 후 수정 된 HTML로 전체 페이지를 다시 리로딩이 장치 폭 자바 스크립트보다는 HTML 을 변경을 통해 후 조작하는 것이 훨씬 더 효율적이 될 것입니다. (이 뷰포트의 폭을 변경하는 경우에도 필요의 경우도 고려)

이 작동합니다 :

- (void)webViewDidFinishLoad:(UIWebView *)aWebView { 
    if(aWebView.frame.size.width < aWebView.window.frame.size.width) { 
     // width=device-width results in a wrong viewport dimension for webpages displayed in a popover 
     NSString *jsCmd = @"var viewport = document.querySelector('meta[name=viewport]');"; 
     jsCmd = [jsCmd stringByAppendingFormat:@"viewport.setAttribute('content', 'width=%i, initial-scale=1.0, user-scalable=1');", (NSUInteger)aWebView.frame.size.width]; 
     [aWebView stringByEvaluatingJavaScriptFromString:jsCmd]; 
    } 
    // stop network indicator 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 
3

이 뷰포트 메타 태그가있을 것이다 존재하지 않는 경우 auco 대답의 향상된 버전입니다 추가 :

여기
- (void)webViewDidFinishLoad:(UIWebView*)webView 
{ 
    int webviewWidth = (NSUInteger)webView.frame.size.width; 

    if (!webView.loading) { 

     NSString *jsCmd = [NSString stringWithFormat:@"try {var viewport = document.querySelector('meta[name=viewport]');if (viewport != null) {viewport.setAttribute('content','width=%ipx, initial-scale=1.0, user-scalable=1');} else {var viewPortTag=document.createElement('meta');viewPortTag.id='viewport';viewPortTag.name = 'viewport';viewPortTag.content = 'width=%ipx, initial-scale=1.0, user-scalable=1';document.getElementsByTagName('head')[0].appendChild(viewPortTag);}} catch (e) {/*alert(e);*/}", webviewWidth, webviewWidth]; 

     [webView stringByEvaluatingJavaScriptFromString:jsCmd]; 
    } 
} 

우리가 320 ~

try { 
    var viewport = document.querySelector('meta[name=viewport]'); 
    if (viewport != null) { 
     viewport.setAttribute('content', 
       'width=320px, initial-scale=1.0, user-scalable=1'); 
    } else { 
     var viewPortTag = document.createElement('meta'); 
     viewPortTag.id = 'viewport'; 
     viewPortTag.name = 'viewport'; 
     viewPortTag.content = 'width=320px,initial-scale=1.0, user-scalable=1'; 
     document.getElementsByTagName('head')[0].appendChild(viewPortTag); 
    } 
} catch (e) { 
    /*alert(e);*/ 
} 
,691의 폭과 웹보기에 주입하는 자바 스크립트 꽤 포맷 코드

원하는 경우 try/catch를 제거 할 수 있습니다.

관련 문제