Вы можете использовать оператор of, который будет возвращать список переменных всех пород B и C
let varsForBs [var] of B-here
let varsForCs [var] of C-here
Если у вас есть только один B и C, вы можете просто взять первый элемент из список.
Из iphonedevsdk.com:
Акселерометры использовали в первом поколении и втором поколении iPhone (и я принимаю также касания iPod), работают в двух режимах: +/-2 г, и +/-8 г. (На самом деле, как Вы заметили, они сообщают об ускорениях несколько вне номинального диапазона. Точность не является spec'ed вне того диапазона, все же.)
Apple управляет ими в +/-2-граммовый режим. Существует компромисс: текущее разрешение - номинально 0,018 г, согласно таблице данных (хотя мое первое поколение iPhone использует 0.018168604, согласно измененной версии AccelerometerGraph). В +/-8-граммовый режим, разрешение было бы в четыре раза более сырым.
Я предполагаю, что Apple решила, что более прекрасное разрешение будет более полезным, чем более широкий диапазон. (Я видел бы более прекрасное разрешение, чем 0,018 г. Таким образом, ни один из нас полностью не удовлетворен.)
Вы не можете изменить режим ни с какой опубликованной функцией API. Так как они передают ускорение как двойное, они могли теоретически позволить изменение в режиме и просто посмотреть на режим при перемасштабировании значения A/D перед сообщением об ускорении. (Очевидное место для установки режима было бы в вызове, который настраивает приложение для получения информации об акселерометре.) Однако для обратной совместимости, ОС должна была бы установить режим акселерометра на +/-2 г в начале приложения. И ни одному из фоновых процессов нельзя было позволить установить режим акселерометра.
Я создал следующее приложение, чтобы попытаться проверить диапазоны...
UIAccelerometer *objAccelerometer;
UILabel *lblxmin, *lblxmax, *lblymin, *lblymax, *lblzmin, *lblzmax;
UILabel *lblxnow, *lblynow, *lblznow;
float xmin = 0.0, xmax = 0.0, ymin = 0.0, ymax = 0.0, zmin = 0.0, zmax = 0.0, xnow = 0.0, ynow = 0.0, znow = 0.0;
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
//NSLog (@"%f, %f, %f", acceleration.x, acceleration.y, acceleration.z);
xnow = acceleration.x;
ynow = acceleration.y;
znow = acceleration.z;
if (xnow < xmin) { xmin = xnow; }
if (ynow < ymin) { ymin = ynow; }
if (znow < zmin) { zmin = znow; }
if (xnow > xmax) { xmax = xnow; }
if (ynow > ymax) { ymax = ynow; }
if (znow > zmax) { zmax = znow; }
lblxmin.text = [NSString stringWithFormat:@"%f", xmin];
lblymin.text = [NSString stringWithFormat:@"%f", ymin];
lblzmin.text = [NSString stringWithFormat:@"%f", zmin];
lblxmax.text = [NSString stringWithFormat:@"%f", xmax];
lblymax.text = [NSString stringWithFormat:@"%f", ymax];
lblzmax.text = [NSString stringWithFormat:@"%f", zmax];
lblxnow.text = [NSString stringWithFormat:@"%f", xnow];
lblynow.text = [NSString stringWithFormat:@"%f", ynow];
lblznow.text = [NSString stringWithFormat:@"%f", znow];
}
-(void) invokeAccelerometer {
objAccelerometer = [UIAccelerometer sharedAccelerometer];
objAccelerometer.delegate = self;
objAccelerometer.updateInterval = (1.0 / 10.0);
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
lblxmin = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 40)];
lblxnow = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 100, 40)];
lblxmax = [[UILabel alloc] initWithFrame:CGRectMake(200, 10, 100, 40)];
lblymin = [[UILabel alloc] initWithFrame:CGRectMake(10, 60, 100, 40)];
lblynow = [[UILabel alloc] initWithFrame:CGRectMake(100, 60, 100, 40)];
lblymax = [[UILabel alloc] initWithFrame:CGRectMake(200, 60, 100, 40)];
lblzmin = [[UILabel alloc] initWithFrame:CGRectMake(10, 110, 100, 40)];
lblznow = [[UILabel alloc] initWithFrame:CGRectMake(100, 110, 100, 40)];
lblzmax = [[UILabel alloc] initWithFrame:CGRectMake(200, 110, 100, 40)];
[self.view addSubview:lblxmin];
[self.view addSubview:lblxnow];
[self.view addSubview:lblxmax];
[self.view addSubview:lblymin];
[self.view addSubview:lblynow];
[self.view addSubview:lblymax];
[self.view addSubview:lblzmin];
[self.view addSubview:lblznow];
[self.view addSubview:lblzmax];
[self invokeAccelerometer];
[super viewDidLoad];
}
Проблема, когда я поворачиваю свой iPod вдоль горизонтальных/вертикальных осей и затем переворачиваю его, я получаю значения как:
xmin-1.271802
xmax 1.180959
ymin-1.344477
ymax 1.108285
zmin-2.30713
zmax 2.325581
Если я беру iPod и встряхиваю heck из него, я добираюсь...
x-. 325581 к 2,307413
y-. 325581 к 2,307413
z-. 307413 к 2,325581
Какие-либо идеи, что это измеряет?
Лучшее, которое я придумал:
вертикальная ось
x =-1, если наклонено налево (<|)
x = +1, если наклонено полностью направо (|>)
y ~-1, если экран стоит перед Вами, перпендикуляром на пол ("выдерживание")
y ~ 1 при отворачивании от Вас (и вверх тормашками)
The aGauge app displays this raw data coming from the accelerometer as you move the device. It can also help you find the "flip" threshold for your device.