Programing

UIWebView가 세로로 "튀는"것을 중지 하시겠습니까?

lottogame 2020. 4. 18. 09:27
반응형

UIWebView가 세로로 "튀는"것을 중지 하시겠습니까?


누구나 UIWebView가 세로로 튀는 것을 막는 방법을 알고 있습니까? 사용자가 iPhone 화면을 터치하고 손가락을 아래쪽으로 끌면 웹뷰에 내가로드 한 웹 페이지 위에 빈 자리가 표시됩니까?

나는 다음과 같은 가능한 해결책을 보았지만 그중 어느 것도 나를 위해 일하지 않았다.

http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html

http://forums.macrumors.com/showthread.php?t=619534

UIScrollView가 가로로 튀는 것을 어떻게 중지합니까?


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

... 잘 작동하는 것 같습니다.

App Store에도 적용됩니다.

업데이트 :에 아이폰 OS 5.x의 +가 쉬운 방법이야 - UIWebViewscrollView코드는 다음과 같이 할 수 있도록 속성을 :

webView.scrollView.bounces = NO;

동일합니다 WKWebView.


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 

}

나를 위해 잘 작동합니다 ... 또한,이 질문에 대한 틱 된 대답은 당신이 당신의 아이폰 애플 리케이션에서 사용하는 경우 애플이 거부 할 것입니다.


iOS 5 SDK에서는 하위보기를 반복하지 않고 웹보기와 연관된 스크롤보기에 직접 액세스 할 수 있습니다.

따라서 스크롤보기에서 '수신 거부'를 비활성화하려면 다음을 사용할 수 있습니다.

myWebView.scrollView.bounces = NO;

참고 항목 있는 UIWebView 클래스 참조 .

그러나 5.0 이전 버전의 SDK를 지원해야하는 경우 Mirek Rusin의 조언을 따라야 합니다.


스위프트 3

webView.scrollView.bounces = false

경고. 내 앱에서 setAllowsRubberBanding :을 사용했고 Apple은 비공개 API 함수는 허용되지 않는다고 언급하여 거부했습니다 (인용 : 3.3.1)


바운스를 비활성화하려면 Swift에서

webViewObj.scrollView.bounces = false

브래드의 방법이 나를 위해 일했습니다. 그것을 사용하면 조금 더 안전하게 만들고 싶을 수도 있습니다.

id scrollView = [yourWebView.subviews objectAtIndex : 0];
if ([scrollView respondsToSelector : @selector (setAllowsRubberBanding :)])
{
    [scrollView performSelector : @selector (setAllowsRubberBanding :) withObject : NO];
}

사과가 무언가를 변경하면 바운스가 다시 나타나지만 최소한 앱은 다운되지 않습니다.


iOS5에서는 사용자가 웹뷰 콘텐츠를 확대 (예 : 두 번 탭) 할 수있는 경우에만 바운스 설정이 충분하지 않습니다. alwaysBounceHorizontal 및 alwaysBounceVertical 속성도 NO로 설정해야합니다. 그렇지 않으면 기본으로 확대 / 축소 (또 다른 두 번 탭)하면 다시 바운스됩니다.


UIWebView의 하위 뷰 모음을 탐색하고 배경을 웹 페이지 배경과 동일한 색상 인 [UIColor blackColor]로 설정했습니다. 보기는 여전히 튀어 나오지만 그 추한 회색 배경은 표시되지 않습니다.


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)

이것은 사용자 정의 가능한 스크롤 동작으로 웹보기를 만드는 훌륭한 범용 방법입니다. 주의해야 할 사항이 몇 가지 있습니다.

  • 모든보기와 마찬가지로-(id) initWithCoder :을 재정의해야합니다. 인터페이스 빌더에서 사용하는 경우
  • 웹보기를 처음 만들 때 내용 크기는 항상보기 프레임 크기와 같습니다. 웹을 스크롤 한 후 컨텐츠 크기는보기 내의 실제 웹 컨텐츠 크기를 나타냅니다. 이 문제를 해결하기 위해 해킹을 시도했습니다. -setContentOffset : CGPointMake (0,1) animated : YES를 호출하여 알 수없는 변경으로 인해 웹보기의 적절한 콘텐츠 크기를 설정했습니다.

이 답을 찾는 것을 가로 질러 왔고 결국 나는 엉망으로 내 자신의 답을 얻었습니다. 내가 했어

[[webview scrollView] setBounces:NO];

그리고 효과가있었습니다.


이것은 나를 위해, 아름답게 작동했습니다 (webView와 함께 phonegap을 사용하고 있습니다)

[[webView.webView scrollView] setScrollEnabled:NO];

또는

[[webView scrollView] setScrollEnabled: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에 앱을 제출하지 않았습니다. 그러나 지금까지 문서화되지 않은 것을 사용하지 않았다고 생각합니다. 다른 사람이 발견하면 알려주십시오.


다음은 두 가지 새로운 잠재적 솔루션입니다. 분명히 jqtouch 또는 pastrykit을 사용하여 스크롤을 비활성화 할 수 있습니다. 그러나 나는 이것들이 작동하지 않았다. 더 유능 할 수도 있습니다.

세로 스크롤 끄기

생과자에 파기


모바일 사파리에서 고정 위치

이 링크는 저에게 많은 도움이되었습니다.


(Xcode 5 iOS 7 SDK 예제) 다음은 scrollview setBounces 함수를 사용하는 Universal App 예제입니다. 여기는 오픈 소스 프로젝트 / 예제입니다. SimpleWebView 링크 (프로젝트 우편 번호 및 소스 코드 예제)


의 하위 견해 중 하나는 UIWebView이어야합니다 UIScrollView. scrollEnabled속성을로 설정 NO하면 웹보기에서 스크롤이 완전히 비활성화됩니다.

참고 : 이것은 기술적으로 개인 API를 사용하므로 향후 OS 릴리스에서 앱이 거부되거나 중단 될 수 있습니다. 사용 @tryrespondsToSelector


bounces속성을 살펴보십시오 UIScrollView. Apple 문서 정리

속성 값이 YES(기본값) 인 경우 내용의 경계에 도달하면 스크롤보기가 튀어 오릅니다. 수신 거부는 스크롤이 컨텐츠의 가장자리에 도달했음을 나타냅니다. 값이 NO경우 수신 거부없이 컨텐츠 경계에서 즉시 스크롤이 중지됩니다.

올바른를 사용하고 있는지 확인하십시오 UIScrollView. 의 계층 구조가 확실하지 UIWebView않지만 스크롤 뷰는의 하위가 아닌 상위가 될 수 있습니다 UIWebView.


UIWebView스크롤 을 비활성화하려면 다음 코드 줄을 사용할 수 있습니다.

[ObjWebview setUserInteractionEnabled:FALSE];

이 예에서는 ObjWebview유형 UIWebView입니다.


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

참고 URL : https://stackoverflow.com/questions/500761/stop-uiwebview-from-bouncing-vertically

반응형