이렇게하는 방법이 있지만 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
입니다.이것은 스크롤 애니메이션이 발생하는 것을 막는 것처럼 보입니다.
텍스트 영역이나 일반적으로이 기능을 원하십니까? –
WebView에서 나타날 수있는 텍스트 영역 요소가 아니라 WebView에서 위쪽 화살표 및 아래쪽 화살표 키를 사용하여 탐색 할 때 발생하는 애니메이션 스크롤을 비활성화하려고합니다. (WebViewTest 응용 프로그램이나 WebViewTest.html 문서의 WebView에는 textarea 요소가 들어 있지 않습니다.) – bsw111
아, 나는 당신이 원한 것을 오해했습니다. 내가 두려워하는 답변이 없지만 각 탭이 실제로 자체 프로세스에서 실행되고 호스트의 일부인 것처럼 Safari가 더 이상 일반 'WebView'를 사용하지 않는다는 것을 지적 할 수 있습니다 앱 –