我認爲有辦法做到這一點,但它需要使用Objective-C運行時修改私有類的私有方法。
要使用Objective-C運行時,在AppDelegate.m的Xcode項目頂部添加
#import <objc/runtime.h>
到#import
指令。
滾動動畫出現在私有方法
- (BOOL)_scrollTo:(const CGPoint *)pointRef animate:(NSInteger)animationSpecifier flashScrollerKnobs:(NSUInteger)knobFlashSpecifier
的
NSClipView
發生。
我們不能通過子類修改由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」;我正在使用「直接覆蓋」方法調整。
由於此代碼,將調用scrollTo_override()
而不是WebClipView
方法-[_scrollTo:animateScroll:flashScrollerKnobs:]
。所有scrollTo_override()
確實是調用原始-[_scrollTo:animateScroll:flashScrollerKnobs:]
與2作爲animationSpecifier
。這似乎阻止了滾動動畫的發生。
你想要特別爲文本區域,或一般? –
我想禁用在WebView中使用向上箭頭和向下箭頭鍵進行導航時發生的動畫滾動,而不是可能出現在WebView中的textarea元素。 (WebViewTest應用程序中的WebView和WebViewTest.html文檔都不包含textarea元素。) – bsw111
啊,我誤解了你想要的東西。恐怕沒有答案,但我可以指出,Safari不再使用常規的「WebView」,因爲每個選項卡實際上都在其自己的進程中運行,並且顯示爲它是主機的一部分應用 –