2012-05-11 11 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で属性がtrueに設定されているhtml文書を開くと、文書内に挿入ポイントを設定して、上矢印キーと下矢印キーを使用して移動できます。このようにナビゲートすると、スクロールはアニメーション化されません。ビューは瞬時にスクロールします。ここで

は、この動作を確認するために使用することができ、HTML文書である: http://dl.dropbox.com/u/78928597/WebViewTest.html

SafariがWebViewのを使用し、それが瞬時にスクロールするので、任意のWebViewののスクロール動作を変更する方法がありませんように、それはそうしかし、私はそれを見つけることに運がなかった。

矢印キーを使用して移動する前に挿入ポイントを設定する必要があります。そうしないと、さまざまな動作が表示されます。

+0

これは特にテキスト領域、または一般的に必要なのでしょうか? –

+0

WebViewに表示される可能性のあるテキストエリアの要素ではなく、WebViewの上向き矢印キーと下向き矢印キーを使用してナビゲートするときに発生するアニメーションスクロールを無効にしたいとします。 (WebViewTestアプリケーションまたはWebViewTest.htmlドキュメントのWebViewには、テキストエリアの要素は含まれていません)。 – bsw111

+0

ああ、私はあなたが望むものを誤解していました。私が恐れている答えはありませんが、各タブは実際には独自のプロセスで実行され、ホストの一部であるかのように表示されるため、Safariは通常の「WebView」を使用しないことを指摘できますアプリ –

答えて

4

私はこれを行う方法があると思いますが、Objective-Cランタイムを使用してプライベートクラスのプライベートメソッドを変更する必要があります。

Xcodeプロジェクト内AppDelegate.mの上部に#import指令に

#import <objc/runtime.h> 

を追加し、Objective-Cのランタイムを使用するには。

スクロールアニメーションは、プライベートメソッドNSClipView

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

に発生することが表示されます。

サブクラス化によってWebViewで管理されているNSClipViewオブジェクト(実際にはプライベートクラスWebClipViewのインスタンス)を変更することはできません。代わりに、メソッドswizzlingと呼ばれる手法を使用できます。あなたのAppDelegateクラスの@implementation

、あなたがマイクアッシュの記事、“Method Replacement for Fun and Profit”にここに何が起こっているかについての詳細を読むことができます

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

を追加します。私は "直接オーバーライド"メソッドswizzlingを使用しています。

このコードの結果、WebClipViewメソッド-[_scrollTo:animateScroll:flashScrollerKnobs:]の代わりにscrollTo_override()が呼び出されます。 scrollTo_override()はすべて、元の-[_scrollTo:animateScroll:flashScrollerKnobs:]を2としてanimationSpecifierと呼びます。これは、スクロールアニメーションの発生を防ぐようです。

関連する問題