2012-05-11 2 views
1

Mac OS X Lion에서 화살표 키를 사용하여 WebView 내에서 탐색 할 때 발생하는 애니메이션을 어떻게 비활성화합니까?Mac OS X Lion의 WebView에서 스크롤 애니메이션을 비활성화 하시겠습니까?

내가 변경하려고하는 동작은 Mac OS X Lion의 WebViews에 대한 기본값으로 표시됩니다. 문서를 WebView에로드하고 삽입 포인터를 설정 한 다음 위쪽 화살표 및 아래쪽 화살표 키를 사용하여 탐색하면 즉석이 아닙니다. 애니메이션이 있습니다 (보기가 눈에 띄게 위로 또는 아래로 스크롤됩니다). 여기

는이 동작을 참조하는 데 사용할 수있는 Xcode 프로젝트입니다 (그냥 응용 프로그램을 실행 문서 내 삽입 지점을 설정 한 다음 탐색하려면 위쪽 화살표 및 아래쪽 화살표 키를 사용하도록 뷰 스크롤) : http://dl.dropbox.com/u/78928597/WebViewTest.zip

내가 달성하고자하는 동작은 Safari에서 일어나는 일입니다. Safari에서 contenteditable 속성이 true으로 설정된 html 문서를 열면 문서 내에 삽입 포인터를 설정 한 다음 위쪽 화살표 및 아래쪽 화살표 키를 사용하여 탐색 할 수 있습니다. 이 방법으로 탐색하면 스크롤이 애니메이션으로 표시되지 않습니다. 뷰가 즉시 스크롤됩니다. 여기

는이 동작을 참조하는 데 사용할 수있는 HTML 문서입니다 : 어떤 웹보기의 스크롤 동작을 변경할 수있는 방법이 있어야한다처럼 사파리는 웹보기를 사용하고 즉시 스크롤 때문에 http://dl.dropbox.com/u/78928597/WebViewTest.html

것 같습니다 , 그러나 나는 그것을 발견하는 것에 운을 가지지 않고 있었다.

화살표 키를 사용하여 탐색하기 전에 삽입 포인터를 설정해야합니다. 그렇지 않으면 다른 동작이 나타납니다.

+0

텍스트 영역이나 일반적으로이 기능을 원하십니까? –

+0

WebView에서 나타날 수있는 텍스트 영역 요소가 아니라 WebView에서 위쪽 화살표 및 아래쪽 화살표 키를 사용하여 탐색 할 때 발생하는 애니메이션 스크롤을 비활성화하려고합니다. (WebViewTest 응용 프로그램이나 WebViewTest.html 문서의 WebView에는 textarea 요소가 들어 있지 않습니다.) – bsw111

+0

아, 나는 당신이 원한 것을 오해했습니다. 내가 두려워하는 답변이 없지만 각 탭이 실제로 자체 프로세스에서 실행되고 호스트의 일부인 것처럼 Safari가 더 이상 일반 'WebView'를 사용하지 않는다는 것을 지적 할 수 있습니다 앱 –

답변

4

이렇게하는 방법이 있지만 Objective-C 런타임을 사용하여 개인 클래스의 개인 메서드를 수정해야합니다.

은, Objective-C 런타임을 사용하여 Xcode 프로젝트에 AppDelegate.m의 상단에있는 #import 지침에

#import <objc/runtime.h> 

을 추가합니다.

스크롤 애니메이션은 개인 방법 NSClipView

- (BOOL)_scrollTo:(const CGPoint *)pointRef animate:(NSInteger)animationSpecifier flashScrollerKnobs:(NSUInteger)knobFlashSpecifier 

에 발생하는 것으로 나타납니다.

서브 클래 싱을 통해 WebView에 의해 관리되는 NSClipView 개체 (실제로는 개인 클래스 WebClipView)를 수정할 수 없습니다. 대신 메서드를 사용하여 스위 즐링을 사용할 수 있습니다. 당신의 AppDelegate 클래스의 @implementation에서

, 추가

static BOOL (*kOriginalScrollTo)(id, SEL, const CGPoint *, NSInteger, NSUInteger); 

static BOOL scrollTo_override(id self, SEL _cmd, const CGPoint *pointRef, NSInteger animationSpecifier, NSUInteger knobFlashSpecifier) 
{ 
    return kOriginalScrollTo(self, _cmd, pointRef, 2, knobFlashSpecifier); 
} 

+ (void)load 
{ 
    SEL selector = @selector(_scrollTo:animateScroll:flashScrollerKnobs:); 
    id WebClipViewClass = objc_getClass("WebClipView"); 
    Method originalMethod = class_getInstanceMethod(WebClipViewClass, selector); 
    kOriginalScrollTo = (void *)method_getImplementation(originalMethod); 
    if(!class_addMethod(WebClipViewClass, selector, (IMP)scrollTo_override, method_getTypeEncoding(originalMethod))) { 
     method_setImplementation(originalMethod, (IMP)scrollTo_override); 
    } 
} 

당신은 마이크 애쉬의 기사에서 여기에서 무슨 일이 일어나고 있는지에 대한 자세한 내용을보실 수 있습니다, “Method Replacement for Fun and Profit”; "직접 재정의 (Direct Override)"방법을 사용하고 있습니다.

이 코드의 결과로 WebClipView-[_scrollTo:animateScroll:flashScrollerKnobs:] 대신 scrollTo_override()이 호출됩니다. scrollTo_override()은 모두 원래 -[_scrollTo:animateScroll:flashScrollerKnobs:]이고 2는 animationSpecifier입니다.이것은 스크롤 애니메이션이 발생하는 것을 막는 것처럼 보입니다.