programing

UI Web View가 수직으로 "바운스"되지 않도록 하시겠습니까?

iphone6s 2023. 4. 17. 21:32
반응형

UI Web View가 수직으로 "바운스"되지 않도록 하시겠습니까?

UI Web View가 수직으로 튀는 것을 멈추는 방법을 아는 사람이 있습니까?즉, 사용자가 아이폰 화면을 터치하고 손가락을 아래로 끌면 웹 뷰에 로드한 웹 페이지 위에 공백이 표시됩니다.

다음과 같은 가능한 해결책을 찾아봤지만, 어느 솔루션도 효과가 없었습니다.

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

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

UIScroll View가 수평으로 튀지 않도록 하려면 어떻게 해야 합니까?

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

...잘 작동되지 않습니다.

앱스토어에도 접수됩니다.

업데이트: iOS 5.x+에서는 보다 쉬운 방법이 있습니다.UIWebView 있다scrollView코드를 다음과 같이 만들 수 있습니다.

webView.scrollView.bounces = NO;

도 마찬가지입니다.WKWebView.

QuickConnect라고 하는 iPhone의 완전 설치 가능한 어플리케이션으로서 Web 앱을 간단하게 작성할 수 있는 프로젝트를 검토하고 있었습니다만, 화면을 스크롤 할 수 있는 것이 전혀 필요 없는 경우, 동작하는 솔루션을 찾았습니다만, 제 경우는 그렇지 않았습니다.

상기 프로젝트/블로그 투고에서는 바운싱을 끄기 위해 추가할 수 있는 javascript 기능을 언급하고 있습니다.이것은 기본적으로 다음과 같습니다.

    document.ontouchmove = function(event){
        event.preventDefault();
    }

구현 방법에 대한 자세한 내용은 Quick Connect를 다운로드하여 확인하시기 바랍니다.하지만 기본적으로 페이지 로딩에 javascript를 호출하는 것이 전부입니다.서류 머리글에 넣으려고 했는데 잘 되는 것 같아요.

이 목적을 달성하기 위해 제가 한 일은 다음과 같습니다.

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 

}

난 괜찮아...또한, 이 질문에 대한 체크 표시가 있는 답변은 iPhone 앱에서 사용하면 애플이 거절할 것입니다.

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

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

myWebView.scrollView.bounces = NO;

UI WebView클래스 레퍼런스를 참조해 주세요.

(단, SDK 5.0 이전 버전을 지원해야 하는 경우 Mirek Rusin의 조언을 따라야 합니다.)

스위프트 3

webView.scrollView.bounces = false

경고.내 앱에서 setAllowsRubberBanding:을 사용했는데 애플이 공개되지 않은 API 기능은 허용되지 않는다며 거부했습니다(cite: 3.3.1).

Swift에서 바운스를 비활성화합니다.

webViewObj.scrollView.bounces = false

브래드의 방법이 통했어그것을 사용한다면 조금 더 안전하게 하는 것이 좋을지도 모릅니다.

id scrollView = [yourWebView.subviews objectAt]색인: 0];
if( [scrollView responsesToSelector:@selector(setAllowsRubberBanding:)]){[scrollView performSelector : @selector ( setAllowsRubberBanding : ) with Object : ]아니요];}

애플이 무언가를 바꾸면 바운스는 돌아오지만 적어도 당신의 앱은 크래쉬하지 않습니다.

iOS5에서는 사용자가 웹뷰 콘텐츠를 확대(예: 더블 탭)할 계획인 경우에만 바운스 설정이 충분하지 않습니다.또한 항상 BounceHorizontal 속성 및 alwaysBounceVertical 속성도 NO로 설정해야 합니다.그렇지 않으면 줌아웃(다른 더블 탭...)을 디폴트로 하면 다시 바운스가 됩니다.

UI WebView의 서브뷰 컬렉션을 이동해, Web 페이지의 배경과 같은 색상의 [UICollor blackColor]로 배경을 설정했습니다.보기는 계속 튕겨지지만 보기 흉한 짙은 회색 배경은 표시되지 않습니다.

UI Web View에 UIScroll View가 있는 것 같습니다.문서화된 API를 사용할 수 있지만 바운싱은 개별적으로가 아니라 양방향으로 설정됩니다.이것은 API 문서에 있습니다.UIScroll View에는 바운스 속성이 있으므로 다음과 같은 기능이 있습니다(스크롤 뷰가 여러 개 있는지 알 수 없음).

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;
    }
}

UI Web View가 스크롤 뷰가 아닌 것을 알고 짜증이 나서, Web 뷰의 스크롤 뷰로 커스텀 서브 클래스를 작성했습니다.이 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) 애니메이션:[YES] : 웹 보기의 적절한 내용 크기를 설정하는 눈에 띄지 않는 변경을 강제합니다.

답을 찾으려다 우연히 알게 되었고, 결국 제 스스로 답을 찾아내는 행운을 잡게 되었습니다.했다

[[webview scrollView] setBounces:NO];

그리고 그것은 성공하였다.

이것은 나에게도 효과가 있고, 훌륭하게 (webView에서 전화 갭을 사용하고 있습니다)

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

또는

[[webView scrollView] setScrollEnabled:NO];

UI Web View 객체의 스크롤이나 바운싱을 방지하기 위해 제스처 인식기를 추가하여 다른 제스처를 덮어쓰는 방법을 시도했습니다.

UI Web View 또는 그 스크롤러 서브뷰는 자체 팬 제스처 인식자를 사용하여 사용자의 스크롤을 검출하는 것 같습니다.그러나 애플의 문서에 따르면 제스처 인식기를 다른 제스처 인식기로 덮어쓰는 합법적인 방법이 있다.UIGestureRecognizerDelegate 프로토콜에는 충돌하는 제스처 인식자의 동작을 제어할 수 있는 gestureRecognizer:Should RecognizerWithGestureRecognizer: - 메서드가 있습니다.

그래서 제가 뭘 했냐면

뷰 컨트롤러의 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.뷰를 분석하고 어떤 뷰에 따라 결정을 내릴 수 있습니다.

마지막으로 완전성을 위해 팬 핸들러로 등록한 방법:

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer 
{ 
    // do nothing as of yet
}

웹 뷰의 스크롤과 바운싱을 취소하는 것만을 원하는 경우 비워둘 수도 있고, 우리가 정말로 원하는 종류의 팬 모션과 애니메이션을 구현하는 자체 코드를 포함할 수도 있습니다.

지금까지 저는 이 모든 것들을 실험해 보았고, 제가 원하는 대로 어느 정도 작동하는 것 같습니다.아직 iStore에 앱을 제출하지 않았습니다.하지만 지금까지 문서화되지 않은 것을 사용한 적은 없는 것 같아요다른 사람이 발견되면 알려주세요.

다음은 잠재적인 새로운 해결책 2가지입니다.스크롤을 비활성화하려면 jqtouch 또는 pastrykit을 사용할 수 있다고 합니다.하지만, 나는 이것들을 사용할 수 없다.당신이 더 유능할 수도 있어요.

수직 스크롤 끄기

패스트리킷을 파고드는 모습

모바일 safari에서의 고정 위치 설정

이 링크는 나에게 많은 도움을 주었다.쉬워요.데모가 있어요.

(Xcode 5 iOS 7 SDK 예제) 다음은 스크롤뷰 setBounces 함수를 사용한 유니버설 앱 예제입니다.오픈 소스 프로젝트/예: Simple WebView 링크(프로젝트 Zip소스 코드 예시)

의 서브뷰 중 하나UIWebView가 되어야 한다UIScrollView. 설정scrollEnabled의 재산.NO그러면 웹 뷰의 스크롤이 완전히 비활성화됩니다.

주의: 이는 기술적으로 개인 API를 사용하기 때문에 향후 OS 릴리즈에서 앱이 거부되거나 크래시 될 수 있습니다.사용하다@try그리고.respondsToSelector

를 조사합니다.bounces의 특성UIScrollView. Apple 문서를 참조합니다.

속성 값이 다음과 같은 경우YES(기본값) 스크롤 뷰는 콘텐츠 경계에 도달하면 바운스됩니다.바운싱은 스크롤이 콘텐츠의 가장자리에 도달했음을 나타냅니다.값이 다음과 같은 경우NO스크롤은 바운스 없이 콘텐츠 경계에서 즉시 정지합니다.

올바른 기능을 사용하고 있는지 확인합니다.UIScrollView계층이 어떻게 생겼는지 모르겠어요.UIWebView단, 스크롤뷰는 서브가 아닌UIWebView.

무효로 하려면UIWebView스크롤은 다음 코드 행을 사용할 수 있습니다.

[ObjWebview setUserInteractionEnabled:FALSE];

이 예에서는,ObjWebview종류UIWebView.

webView.scrollView.scrollEnabled=아니요. webView.scrollView.바운스=아니요.

언급URL : https://stackoverflow.com/questions/500761/stop-uiwebview-from-bouncing-vertically

반응형