3

touchesMoved最近、 内からタッチ イベント ( など)を登録できないという問題がありましたUIScrollView。多くの人と話し、たくさんの投稿を読んだ後、タッチ自体を受け入れず、代わりにタッチをサブクラスUIScrollViewに渡す必要があることがわかりました。UIScrollView

私はobjective-cに非常に慣れていないため、サブクラスがどのように定義されているか(個別の.h/.mファイルまたは@interfaceなどで)、およびiOSがレスポンダーチェーンをどのように処理するかについて頭を悩ませています。 .

私の正確な状況を説明させてください.Noobで何をする必要があるかを説明してくれる人は誰でも本当に感謝しています.

アプリに単一のページがあり、デフォルトUIViewをに変更したUIScrollViewので、それをInterfaceBuidlerすべて調べると、私のSampleViewControllerとが表示されUIScrollViewます。私は次のように自分UIScrollViewをのにリンクしました:@InterfaceSampleViewControler.h

#import <UIKit/UIKit.h>
@interface SampleViewController : UIViewController
{
}
@property (strong, nonatomic) IBOutlet UIScrollView *mainScroller;
@end

そして、私は次のように私のUIScrollView inを参照しましSampleViewController.mた:

#import "SampleViewController.h"
@interface SampleViewController ()
@end

@implementation SampleViewController
@synthesize mainScroller = _mainScroller;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Movement!");
}

-(void)viewWillAppear:(BOOL)animated
{
    [_mainScroller setContentOffset:CGPointMake(0,0) animated:YES];
}

のクラスを に変更するUIScrollViewUIView、タッチが検出され、いくつかのNSLogメッセージが送信されます。ただし、UIViewを に戻すとUIScrollView、タッチは無視されます。

私が理解していることからUIScrollView、コードを使用してサブクラスをセットアップする必要があります。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Movement!");
}

...そして、SampleViewController.m を次のコードに変更します。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];
}

ただし、1) そのようなサブクラスをセットアップする方法、および 2) なぜこれが機能するのか[[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];がよくわかりません。 .SampleViewController.mNSLog(@"Movement!");

私は見つけることができるすべてのチュートリアルを試しましたが、SE の専門知識に目を向けています! ありがとう。

4

2 に答える 2

1

あなたはこれについて間違って考えています。scrollView がいつ動いているかを知りたい場合は、サブクラス化する必要はありません。iOS は、必要なすべてのメソッドをUIScrollViewDelegate. ただし、スクロールビュー内に基づいたアイテムの touchEvents を取得する場合は、まったく問題ありません。次に、scrollView 内のアイテムをサブクラス化し、それぞれのクラス内で touchEvents を取得する必要があります。ただし、標準の scrollView メソッドの場合は、次のように設定する必要があります。

.H

  #import <UIKit/UIKit.h>
  @interface SampleViewController : UIViewController<UIScrollViewDelegate>
  {
  }
  @property (strong, nonatomic) IBOutlet UIScrollView *mainScroller;
  @end

.M

#import "SampleViewController.h"

@interface SampleViewController ()
@end

@implementation SampleViewController
@synthesize mainScroller = _mainScroller;

-(void)viewDidLoad
{
   self.mainScroller.delegate=self;//Adopt the delegate for the scrollView..this is the important line
}

次に、UIScrollViewDelegateMethods を実装して動きなどを取得します。scrollView/tableView 内で touchEvents を取得しようとすると、未定義の動作が発生します。これは、scrollView 自体が舞台裏でこれらの touchEvents を既に実装しているためです。

開発者サイトですべてのメソッドを確認し、.M ファイルに実装してください。viewDidLoad でデリゲートを採用したので、これらは scrollView コールバックになります。以前にそれらのいくつかをリストしましたが、UIScrollViewDelegate Protocol サイトを見てください。

– scrollViewDidScroll:
– scrollViewWillBeginDragging:
– scrollViewWillEndDragging:withVelocity:targetContentOffset:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewShouldScrollToTop:
– scrollViewDidScrollToTop:
– scrollViewWillBeginDecelerating:
– scrollViewDidEndDecelerating:
于 2013-06-13T00:04:11.627 に答える
0

数日前に同様の質問への回答を投稿しました。これも役立つかもしれません。この質問私の回答を参照してください。

ほぼ機能しているように見えますが、touchesMovedメソッドをどこに配置するかについて少し混乱しています。

のサブクラスにはUIScrollView、次のものが必要です。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];
}

そしてあなたのSampleViewController.mファイルで:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Movement!");
}

(あなたの質問では、これら2つは逆になっています。)

于 2013-06-14T02:28:05.633 に答える