누구든지 UIWebView가 세로로 튀는 것을 막는 방법을 알고 있습니까? 사용자가 iPhone 화면을 터치하고 손가락을 아래쪽으로 끌면 웹뷰에 내가로드 한 웹 페이지 위에 빈 자리가 표시됩니까?
나는 다음과 같은 가능한 해결책을 보았지만 그중 어느 것도 나를 위해 일하지 않았다.
누구든지 UIWebView가 세로로 튀는 것을 막는 방법을 알고 있습니까? 사용자가 iPhone 화면을 터치하고 손가락을 아래쪽으로 끌면 웹뷰에 내가로드 한 웹 페이지 위에 빈 자리가 표시됩니까?
나는 다음과 같은 가능한 해결책을 보았지만 그중 어느 것도 나를 위해 일하지 않았다.
답변:
for (id subview in webView.subviews)
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
((UIScrollView *)subview).bounces = NO;
... 잘 작동하는 것 같습니다.
App Store에도 적용됩니다.
업데이트 :에 아이폰 OS 5.x의 +가 쉬운 방법이야 - UIWebView
이 scrollView
코드는 다음과 같이 할 수 있도록 속성을 :
webView.scrollView.bounces = NO;
동일합니다 WKWebView
.
UIWebView
전화를 걸 [webView setBounces:NO]
수 있도록 카테고리를 추가했습니다 .
QuickConnect 라는 iPhone에서 완전한 설치 가능한 응용 프로그램으로 웹 응용 프로그램을 쉽게 만들 수있는 프로젝트를 찾고 있었고 화면을 스크롤 할 수 없도록하려는 경우 작동하는 솔루션을 찾았습니다. 나는하지 않았다.
위에서 언급 한 프로젝트 / 블로그 게시물에서 수신 거부 기능을 해제하기 위해 추가 할 수있는 자바 스크립트 기능에 대해 언급했습니다.이 기능은 본질적으로 다음과 같이 요약됩니다.
document.ontouchmove = function(event){
event.preventDefault();
}
구현 방법에 대한 자세한 내용을 보려면 QuickConnect를 다운로드하여 확인하십시오 ... 그러나 기본적으로 페이지로드시 해당 자바 스크립트를 호출하기 만하면됩니다. 잘 작동하는 것 같습니다.
이 작업을 수행하기 위해 수행 한 작업은 다음과 같습니다.
UIView *firstView = [webView.subviews firstObject];
if ([firstView isKindOfClass:[UIScrollView class]]) {
UIScrollView *scroll = (UIScrollView*)firstView;
[scroll setScrollEnabled:NO]; //to stop scrolling completely
[scroll setBounces:NO]; //to stop bouncing
}
나를 위해 잘 작동합니다 ... 또한,이 질문에 대한 틱 된 대답은 당신이 당신의 아이폰 애플 리케이션에서 사용하는 경우 애플이 거부 할 것입니다.
UIScrollView
은 현재의 첫 번째 서브 뷰가 현재로서는 사실 UIWebView
일 수도 있지만 iOS 또는 특정 구성에 대한 향후 (사소한) 업데이트에서 쉽게 변경 될 수 있다는 사실에 의존하고 있습니다. 당신은 정말해야 할 for
이상 반복을 subviews
실제로 찾기 위해 UIScrollView
정말 그 많은 일을하지 않고 적어도 당신이 얻을 보장 ( UIScrollView
... 프로그램을 충돌하지
iOS 5 SDK에서는 하위보기를 반복하지 않고 웹보기와 연관된 스크롤보기에 직접 액세스 할 수 있습니다.
따라서 스크롤보기에서 '수신 거부'를 비활성화하려면 다음을 사용할 수 있습니다.
myWebView.scrollView.bounces = NO;
참고 항목 있는 UIWebView 클래스 참조 .
그러나 5.0 이전 버전의 SDK를 지원해야하는 경우 Mirek Rusin의 조언을 따라야 합니다.
브래드의 방법이 나를 위해 일했습니다. 그것을 사용하면 조금 더 안전하게 만들고 싶을 수도 있습니다.
id scrollView = [yourWebView.subviews objectAtIndex : 0]; if ([scrollView respondsToSelector : @selector (setAllowsRubberBanding :)]) { [scrollView performSelector : @selector (setAllowsRubberBanding :) withObject : NO]; }
사과가 무언가를 변경하면 바운스가 다시 나타나지만 최소한 앱은 다운되지 않습니다.
iOS5에서는 사용자가 웹뷰 콘텐츠를 확대 (예 : 두 번 탭) 할 수있는 경우에만 바운스 설정이 충분하지 않습니다. alwaysBounceHorizontal 및 alwaysBounceVertical 속성도 NO로 설정해야합니다. 그렇지 않으면 기본으로 확대 / 축소 (또 다른 두 번 탭)하면 다시 바운스됩니다.
UIWebView에 UIScrollView가있는 것처럼 보입니다. 이를 위해 문서화 된 API를 사용할 수 있지만 수신 거부는 개별적으로가 아니라 양방향으로 설정됩니다. 이것은 API 문서에 있습니다. UIScrollView에는 바운스 속성이 있으므로 다음과 같이 작동합니다 (스크롤보기가 두 개 이상 있는지 알지 못함).
NSArray *subviews = myWebView.subviews;
NSObject *obj = nil;
int i = 0;
for (; i < subviews.count ; i++)
{
obj = [subviews objectAtIndex:i];
if([[obj class] isSubclassOfClass:[UIScrollView class]] == YES)
{
((UIScrollView*)obj).bounces = NO;
}
}
UIWebView가 스크롤보기가 아니라는 것을 알게되어 화가 났으므로 웹보기의 스크롤보기를 얻기 위해 사용자 정의 하위 클래스를 만들었습니다. 이 suclass에는 스크롤보기가 포함되어 있으므로 웹보기의 동작을 사용자 정의 할 수 있습니다. 이 수업의 핵심은 다음과 같습니다.
@class CustomWebView : UIWebview
...
- (id) initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
// WebViews are subclass of NSObject and not UIScrollView and therefore don't allow customization.
// However, a UIWebView is a UIScrollViewDelegate, so it must CONTAIN a ScrollView somewhere.
// To use a web view like a scroll view, let's traverse the view hierarchy to find the scroll view inside the web view.
for (UIView* v in self.subviews){
if ([v isKindOfClass:[UIScrollView class]]){
_scrollView = (UIScrollView*)v;
break;
}
}
return self;
}
그런 다음 맞춤 웹보기를 만들 때 다음을 사용하여 수신 거부를 사용 중지 할 수 있습니다.
customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO)
이것은 사용자 정의 가능한 스크롤 동작으로 웹보기를 만드는 훌륭한 범용 방법입니다. 주의해야 할 몇 가지 사항이 있습니다.
UIWebView 객체가 스크롤 및 수신 거부 되는 것을 방지하기 위해 약간 다른 접근법을 시도했습니다 . 다른 제스처를 무시하기 위해 제스처 인식기를 추가하십시오.
그것은 보인다 있는 UIWebView 또는 스크롤의 서브 뷰는 사용자가 스크롤을 감지하는 자신의 팬 제스처 인식기를 사용합니다. 그러나 Apple의 문서에 따르면 한 제스처 인식기를 다른 제스처 인식기를 재정의하는 합법적 인 방법이 있습니다. UIGestureRecognizerDelegate 프로토콜에는 gestureRecognizer : shouldRecognizeSimultaneouslyWithGestureRecognizer : - 메소드가있어 충돌하는 제스처 인식기의 동작을 제어 할 수 있습니다.
그래서 내가 한 일은
뷰 컨트롤러의 viewDidLoad 메소드에서 :
// Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures
// by registering this object as the recognizer's delegate
UIPanGestureRecognizer *recognizer;
recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
recognizer.delegate = self;
recognizer.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:recognizer];
self.panGestureFixer = recognizer;
[recognizer release];
그런 다음 제스처 재정의 방법 :
// Control gestures precedence
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in
// the most painless way)
if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
// Just disable every other pan gesture recognizer right away
otherGestureRecognizer.enabled = FALSE;
}
return NO;
}
물론이 델리게이트 방법은 실제 응용 프로그램에서 더 복잡 할 수 있습니다. 다른 인식기를 선택적으로 비활성화하고 otherGestureRecognizer.view를 분석 하고 뷰에 따라 결정을 내릴 수 있습니다.
그리고 마지막으로 완전성을 기하기 위해 팬 처리기로 등록한 방법은 다음과 같습니다.
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
웹보기의 스크롤 및 수신 거부를 취소하는 것만 큼 비워 두거나 실제로 원하는 팬 모션 및 애니메이션을 구현하는 자체 코드를 포함 할 수 있습니다 ...
지금까지 나는이 모든 것들을 실험하고 있으며, 내가 원하는대로 다소 작동하는 것 같습니다. 그래도 아직 iStore에 앱을 제출하지 않았습니다. 하지만 지금까지 문서화되지 않은 것을 사용하지 않았다고 생각합니다. 다른 사람이 발견하면 알려주십시오.
이 링크는 많은 도움이되었습니다 ..... 쉬운 .. 데모가 있습니다 ..
(Xcode 5 iOS 7 SDK 예제) 다음은 scrollview setBounces 함수를 사용하는 Universal App 예제입니다. 여기는 오픈 소스 프로젝트 / 예제입니다. SimpleWebView 링크 (프로젝트 우편 번호 및 소스 코드 예제)
의 하위 견해 중 하나는 UIWebView
이어야합니다 UIScrollView
. scrollEnabled
속성을로 설정 NO
하면 웹보기에서 스크롤이 완전히 비활성화됩니다.
참고 : 이것은 기술적으로 개인 API를 사용하므로 향후 OS 릴리스에서 앱이 거부되거나 중단 될 수 있습니다. 사용 @try
및respondsToSelector
UIWebView
스크롤 을 비활성화하려면 다음 코드 줄을 사용할 수 있습니다.
[ObjWebview setUserInteractionEnabled:FALSE];
이 예에서는 ObjWebview
유형 UIWebView
입니다.