UIWebView에서 스크롤을 허용하지 않습니까?


90

나는 웹 기사를 보여야한다 UITableView 아래에 .

내가 찾은 유일한 옵션 UIWebView은 tableView 헤더에 기사를 표시하는 것 입니다.

이를 위해 webView 콘텐츠의 높이를 가져와야하고 webView에 대한 스크롤링을 비활성화해야합니다.

스크롤을 비활성화하는 두 가지 솔루션을 찾았습니다.

for (id subview in webView.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).scrollEnabled=NO;

또는 JavaScript에서 :

<script type="text/javascript">
touchMove = function(event) {
    event.preventDefault();
}

첫 번째 해결책은 Apple에서 금지하고 있다고 들었지만 증거가 없습니다. 이 솔루션을 사용하면 신청이 거부됩니까? 그렇다면 거부되지 않고 두 번째 솔루션을 사용할 수 있습니까?

답변:


297

iOS5부터 UIWebView의 scrollview에 직접 액세스 할 수 있습니다.
다음과 같이 스크롤 및 바운스를 비활성화 할 수 있습니다.

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;

3
정말 고마워요. 바로 제가 찾던 것입니다. @jsddour,이 답변을 수락 된 것으로 표시해야합니다!
marcgg

어떤 이유로 이것은 나를 위해 작동하지 않습니다. :-( ScrollView를 넣고 UIWebView를 넣었습니다. 그런 다음 viewWillAppear 메서드에서 위의 두 줄을 설정합니다.하지만 스크롤은 여전히 ​​웹보기에서 작동합니다. 누군가 도와 줄 수 있습니까 ?? 정보를 위해 실행 중입니다. iOS 7 시뮬레이터
Amogh Natu 2014 년

의 용도는 webView.scrollView.bounces = NO;무엇입니까? 첫 번째 줄의 코드가 스크롤을 비활성화했기 때문입니다.
Gon

1
사람들이 기고자에게 찬성표를 줄 시간을 들이지 않고 답변을 받고 달리는 것을 좋아합니다. 사용자에게 투표에 대한 답변을 선택하도록 알리는 방법이 없습니까?
John Cogan

1
SWIFT는 webView.scrollView.scrollEnabled을 위해 = 거짓 / webView.scrollView.bounces = 거짓
Chathuranga 실바

26

이 질문은 여전히 ​​적용 가능하기 때문에 새로운 방법이 있습니다! (iOS 7.0 이상, 아마도 iOS 6도 확인되지 않음)

webView.scrollView.scrollEnabled = NO;

조심하세요 :)


내가 이해하지 못하는 것은 그것이 IB에없는 이유입니다. 그럼에도 불구하고 아주 좋은 해결책!
Mahmud Ahmad

20

웹보기 사용자 상호 작용 속성을 no ie로 간단히 설정할 수 있습니다.

webView.userInteractionEnabled = NO;

꽤 간단하고 잘 작동합니다. 감사합니다 :)


28
그러나 이것은 링크가 탭되는 것을 방지합니다.
Graham Perks 2013 년

@GrahamPerks 나는 :) 귀하의 의견을 존중, 친절 검토를 함께 답을 편집하고, 감사를 승인 한
Eshwar Chaitanya

12

모든 iOS 버전의 경우 setScrollEnabled 대신이 코드를 사용할 수 있습니다.

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}

첫째, "setScrollEnabled"메서드를 시도하고 애플이 내 ipa를 거부했습니다. 그런 다음이 방법을 변경하고 수락했습니다.
mturhan55 2013-08-13

12

이것을 사용하십시오 <body ontouchmove="event.preventDefault()">



7

나는 자바 스크립트를

<script type="text/javascript">
touchMove = function(event) {
event.preventDefault();
}

최고의 솔루션입니다.

사실 :

귀하의 첫 번째 시험 또는

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

문서화되지 않았기 때문에 하나 (동일한 것)가 거부되거나 추가 iOS 업데이트에서 앱이 중단 될 수 있습니다.

그리고

[[myWebView scrollView] setBounces:NO];

방법은 iOS <5에서 작동하지 않습니다.


5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

나를 위해 정렬


4
노출 된 API가 아니기 때문에 이것에 의존하는 것은 잘못된 것입니다.
Deepak Danduprolu 2011 년

[[[WebView 하위보기] lastObject] setScrollingEnabled : NO]; 그것은 나를 위해 그것을 분류했습니다. 어쨌든 내 질문에 대답하지 않습니다. 제 질문은 제가 그렇게 할 수 있다는 것입니까? SDK를 통한 스크롤 비활성화가 금지 된 것 같습니다. 하지만 잘 모르겠습니다. 그리고 자바 스크립트 스크롤을 비활성화하는 것은 어떻습니까?
jsaddour

내 제안이 실제로 subviews 배열의 마지막 subiew를 호출하고 이에 대해 scrollingEnabled를 설정하여 애플에 의해 거부를 유발할 것이라는 증거는 없습니다. 확실히?. 그리고 네가 그것을 사용할 수 있기 때문에 가십시오. 그래도 자바 스크립트를 통해 알 수 없습니다. 죄송합니다.
theiOSDude

3
아니요, 이러면 안됩니다. Deepak이 말했듯이 Apple의 UI 요소 중 하나에서 문서화되지 않은 하위보기의 내부 순서에 의존 할 수 없습니다. 향후 OS 업데이트에서 내부 구조를 변경하면 애플리케이션이 중단됩니다. 그들은 특히 여러 곳에서이 작업을 수행하는 것에 대해 경고했으며 많은 응용 프로그램이 이러한 작업을 수행했기 때문에 iPhone OS 3.0으로 업그레이드 할 때 중단되었습니다.
Brad Larson

5

첫 번째는 Apple에서 거부합니다. 바로 오늘 아침 나에게 일어났습니다.



4

첫 번째 옵션은 애플이 금지 한 것이라고 생각하지 않습니다.

당신은 시도 할 수 있습니다

[[[Webview subviews] lastObject] setScrollingEnabled:NO];

UIWebView에서 링크가 작동하지 않도록하려면 다음을 수행 할 수도 있습니다.

[myWebView setUserInteractionEnabled:NO];


3

이 시도,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    

3

나는 UIWebViewa 내부에 s를 UIScrollView두었고 webview에서 사용자 상호 작용을 비활성화하지 않는 한 스크롤하지 않았습니다 [[webview scrollview] setScrollEnabled:NO]. 그래서 나는 UIWebViews를 안에 UIView넣었고 그것은 나를 위해 일했지만 HTML 내부의 대화 형 링크 또는 div가 UIWebView더 이상 작동하지 않았습니다.

나를 위해 일한 유일한 것은 HTML 상호 작용이 작동하도록 UIWebView내부 를 유지하는 것입니다 UIScrollView.UIScrolling 하지 않도록 .

그런 다음 webview가 수신 할 사용자 지정 대리자를 만들었습니다. window.open("http:/customEvent") webview에 포함 된 HTML에서 호출되는 webview에 . 또한 내 사용자 지정 이벤트를 실행하는 JavaScript 스 와이프 감지 기능을 추가했습니다.

webview 델리게이트가 이것을 수신하면 컨트롤러에 알림을 전달한 다음 동적으로 스크롤합니다. UIScrollView . 분명히 다음 또는 이전 페이지를 모니터링하고 스크롤하는 논리를 만들어야했습니다. 가장 예쁜 솔루션은 아니지만 그것은 나를 위해 일하고 있습니다.


3

HTML ( <HEAD>태그) 에서 시도해보세요.

<script> 
  document.ontouchmove = function(event) { event.preventDefault(); }
</script>

웹 페이지에서 스크롤을 비활성화합니다.

(UIWebView뿐만 아니라 모든 웹 페이지에서 작동)


2

사용자 정의 키보드를 닫으면 webView로 스크롤하는 것이 실제로 엉망이 되었기 때문에 스크롤을 비활성화해야했습니다. 다른 것은 작동하지 않았고 나는 다음과 같은 것에 의지했습니다.

-(void)viewDidLoad{
  [super viewDidLoad];
  [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
  self.webView.scrollView.showsVerticalScrollIndicator = NO;
}  

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (!CGPointEqualToPoint(self.webView.scrollView.contentOffset, CGPointZero)){
        self.contentOffset = CGPointZero;
    }
}

1

UIScrollview에서 UIWebview와 UITableView가 있고 웹뷰의 높이를 설정하고 (그리고 Scrollview의 전체 ContentSize에 추가) 원하는대로 설정합니까?


거의. 그러나 tableView 헤더에 WebView를 표시하는 것은 덜 복잡해 보입니다. 하지만 내 질문은 : SDK를 통해 webView 스크롤을 비활성화 할 수 있습니까? 그렇지 않으면 자바 스크립트를 통해 할 수 있습니까?
jsaddour

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