0

UIImageViews を制御するために使用したいカスタム UIImageView クラスがあります。

カスタム init メソッド内には、UIAccelerometer に関して次のようなものがあります。

    UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
    accelerometer.updateInterval = 0.5f;
    accelerometer.delegate = self;

私の問題は、このクラスのインスタンスが複数あり、加速度計は最後に作成したインスタンスにのみ情報を送信することです。この理由は、デリゲートが最後のインスタンスに設定されているためだとわかっているので、私の質問は次のとおりです。

これらすべてのインスタンスにデリゲートを設定して、すべてのインスタンスが「didAccelerate」呼び出しを受け取る方法はありますか? もしそうなら、どうすればそれについて行くでしょうか。

4

1 に答える 1

1

免責事項: 使用しようとしている方法は非推奨です。CMMotionManager代わりに使用してください。でも:

デリゲートを 1 つ設定し (別のクラスにする必要があります)、NSNotificationCenter を使用して情報を他のリスナーに配布します。例:

@interface SharedAccelerometerListener: NSObject <UIAccelerometerDelegate>
@end

@implementation SharedAccelerometerListener

- (id)init
{
    if ((self = [super init]))
    {
        [UIAccelerometer sharedAccelerometer].delegate = self;
        [UIAccelerometer sharedAccelerometer].updateInterval = 0.05f;
    }
}

- (void)accelerometer:(UIAccelerometer *)acc didAccelerate:(UIAcceleration *)acceleration
{
    NSDictionary *info = [NSDictionary dictionaryWithObject:acceleration forKey:@"acceleration"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"AccelerometerDidAccelerate" sender:nil userInfo:info];
}

@end

次に、リスナークラスで:

id accelerationListener = [[SharedAccelerometerListener alloc] init];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didAccelerate:) name:@"AccelerometerDidAccelerate" object:nil];

- (void)didAccelerate:(NSNotification *)notif
{
    UIAcceleration *acc = [[notif userInfo] objectForKey:@"acceleration"];
    // do whatever you want with the acceleration
}
于 2012-07-30T11:51:42.873 に答える