1

新しいiPhoneの気圧計センサーを使用して、デバイスに垂直速度を表示しようとしています。「モーション」モデルで次のコードになりました。これは、多かれ少なかれ適切な値を与えるために実行されます。

ただし、実行時にビューを更新するという点で問題が発生していますstartRelativeAltitudeUpdatesToQueue。の値userRelativeAltitudeは更新されますが、関数は何も返しません (おそらくstartRelativeAltitudeUpdatesTo Queue、ループのように作業を実行しているためです.?)。残念ながら、声明全体が私の頭の上でかなり終わってしまいました..

私は、例えばのような機能を持たせることに着手しましたstartAccelerometerUpdates。気圧計からデータを収集するより良い方法はありますか?

また、デバイスに気圧センサーが搭載されているかどうかを確認するにはどうすればよいですか?

    - (float) pullRelativeAltitude {

self._altitudeManager = [[CMAltimeter alloc] init];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[self._altitudeManager startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^ {

        _userRelativeAltitude = altitudeData.relativeAltitude.floatValue;
        NSLog(@"%f", altitudeData.relativeAltitude.floatValue);

    });
}];

NSLog(@"This is relative altitude: %f", _userRelativeAltitude is );

return _userRelativeAltitude;

}

提案をいただければ幸いです。

4

3 に答える 3

1

Swift では、次のコードは高度が利用可能かどうかを確認します。

if CMAltimeter.isRelativeAltitudeAvailable() {
  // your code
}

ただし、気圧計の読み取り値も取得できません。

于 2014-09-20T19:54:29.040 に答える
1

あなたがそれを理解したかどうかはわかりませんが、これは私にとってはうまくいきました。
追加することの 1 つ、おそらく既にこれを理解していると思いますが、シミュレーターにいることはできません。iPhone 6 または 6+ が必要で、アプリが電話で実行されている必要があります :)

- (void)viewDidLoad {
    [super viewDidLoad];

    BOOL isReady = [CMAltimeter isRelativeAltitudeAvailable];
    if( isReady ) {
        NSLog(@"yes");
    } else {
        NSLog(@"no");
    }
    alt = [[CMAltimeter alloc] init];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [alt startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^ {
            NSLog(@"%f", altitudeData.relativeAltitude.floatValue);

        });
    }];
}
于 2014-09-21T03:53:03.460 に答える
1

私はそれを機能させましたが、新しい読み取りでUIを更新するには、View Controller(モデルではなく)にコードを実装する必要がありました。興味のある他の人のために、私の最終的なコードは次のようになりました。

if ([CMAltimeter isRelativeAltitudeAvailable]) {
    self._altitudeManager = [[CMAltimeter alloc] init];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [self._altitudeManager startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^ {

            //provide relative altitude
            float relativeAltitude;
            relativeAltitude = altitudeData.relativeAltitude.floatValue;
            self.userRelativeAltitude.text = [NSString stringWithFormat:@"%.0f m", relativeAltitude];

        });
    }];

} else {
    NSLog(@"barometer not available");
    _userVario.text = @"no barometer available";
}

答えてくれてありがとう!

于 2014-09-25T06:43:12.467 に答える