Я использую CMMotionManager для перемещения кнопок, изображений и т. Д. На мой взгляд, когда устройство наклонено вперед, назад, вправо, влево. Я получаю настройку позиции и рулон, а затем использую их для назначения значений строке, представляющей размещение пикселей на экране.jerky motion using CMMotionManager iPhone
Вот как я получить информацию
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 0.05f;
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2];
[formatter setRoundingMode: NSNumberFormatterRoundUp];
numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:motion.attitude.roll /8]];
numberString1 = [formatter stringFromNumber:[NSNumber numberWithFloat:motion.attitude.pitch /8]];
}];
и это, как я задаю их.
NSString *deltax = numberString;
NSString *deltay = numberString1;
NSLog(@"xString;%@",numberString);
if ([deltax isEqualToString:@"-0.01"]) {
xString = @"160";}
else if ([deltax isEqualToString:@"-0.02"]) {
xString = @"161";}
else if ([deltax isEqualToString:@"-0.03"]) {
xString = @"162";}
else if ([deltax isEqualToString:@"-0.04"]) {
xString = @"163";}
т.д.
Я сделал их так, ось х непрерывно идет вверх и вниз (туда и обратно) на экране. то есть -01 то же самое, что и -40, 0,01 и 0,40. и к ним приближаются то же самое, что и вы, начиная с -01 и .01 значения становятся больше и от -40 и до 4,4 меньше. Я сделал то же самое с осью y. -.01 и .01 составляют 284 и -.20 и .20 находятся на уровне 264. Однако в этом случае цифры увеличиваются с -01 и ниже 0,01.
вот некоторые примеры
//x axis
if ([deltax isEqualToString:@"-0.01"]) {
xString = @"160";}
else if ([deltax isEqualToString:@"-0.02"]) {
xString = @"161";}
else if ([deltax isEqualToString:@"-0.03"]) {
xString = @"162";}
else if ([deltax isEqualToString:@"-0.04"]) {
xString = @"163";}
else if ([deltax isEqualToString:@"-0.37"]) {
xString = @"156";}
else if ([deltax isEqualToString:@"-0.38"]) {
xString = @"157";}
else if ([deltax isEqualToString:@"-0.39"]) {
xString = @"158";}
else if ([deltax isEqualToString:@"-0.4"]) {
xString = @"159";}
else if ([deltax isEqualToString:@"0.01"]) {
xString = @"159";}
else if ([deltax isEqualToString:@"0.02"]) {
xString = @"158";}
else if ([deltax isEqualToString:@"0.03"]) {
xString = @"157"; }
else if ([deltax isEqualToString:@"0.04"]) {
xString = @"156";}
else if ([deltax isEqualToString:@"0.37"]) {
xString = @"163";}
else if ([deltax isEqualToString:@"0.38"]) {
xString = @"162";}
else if ([deltax isEqualToString:@"0.39"]) {
xString = @"161";}
else if ([deltax isEqualToString:@"0.4"]) {
xString = @"160";}
//y axis
if ([deltay isEqualToString:@"-0.01"]) {
yString = @"284";}
else if ([deltay isEqualToString:@"-0.02"]) {
yString = @"285";}
else if ([deltay isEqualToString:@"-0.03"]) {
yString = @"286";}
else if ([deltay isEqualToString:@"-0.04"]) {
yString = @"287";}
else if ([deltay isEqualToString:@"-0.17"]) {
yString = @"300"; }
else if ([deltay isEqualToString:@"-0.18"]) {
yString = @"301";}
else if ([deltay isEqualToString:@"-0.19"]) {
yString = @"302";}
else if ([deltay isEqualToString:@"-0.2"]) {
yString = @"303";}
else if ([deltay isEqualToString:@"0.01"]) {
yString = @"283";}
else if ([deltay isEqualToString:@"0.02"]) {
yString = @"282";}
else if ([deltay isEqualToString:@"0.03"]) {
yString = @"281";}
else if ([deltay isEqualToString:@"0.04"]) {
yString = @"280"; }
else if ([deltay isEqualToString:@"0.17"]) {
yString = @"267";}
else if ([deltay isEqualToString:@"0.18"]) {
yString = @"266";}
else if ([deltay isEqualToString:@"0.19"]) {
yString = @"265";}
else if ([deltay isEqualToString:@"0.2"]) {
yString = @"264";}
Таким образом, существует непрерывный поток от одной ориентации к другой.
Однако у меня небольшая проблема. когда телефон перевернут вперед и переходит от ориентации .2 faceUp к ориентации .2 faceDown. Я вздрагиваю. В кнопках FaceUp .2 и т. Д. Перемещаются влево внезапно, и когда он перемещается в faceDown .20, они перемещаются вправо. В противном случае кнопки и т. Д. Центрируются на 0,19 и -19 и возвращаются туда для нормальной работы (как и ожидалось). Я попытался вызвать DeviceOrientationFaceUp и FaceDown, но это, похоже, не помогло.
Есть ли у кого-нибудь опыт в этом поведении и знать об исправлении или какие-либо предложения.
Я также добавляю эту деталь для перемещения кнопок вверх и вниз и сбоку. Используя этот метод, кнопка вверх и вниз сбоку, где бы ни находилась позиция телефона.
//used to assign numerical values
NSString *string2 = xString;
int n = [string2 intValue];
NSLog(@"n:%d",n);
NSString *string3 = xString1;
int p = [string3 intValue];
NSLog(@"p:%d",p);
NSString *string4 = yString;
int q = [string4 intValue];
NSLog(@"q:%d",q);
NSString *string5 = yString1;
int r = [string5 intValue];
NSLog(@"r:%d",r);
//used to move the buttons etc.
imageView2.center = CGPointMake(p, q);
imageView.center = CGPointMake(n -63, q);
imageframe.center = CGPointMake(n -63, q);
textView.center = CGPointMake(n -62, q - 184);
label1.center = CGPointMake(n + 97, q - 195);
english.center = CGPointMake(n + 97, q - 159);
Это своего рода движение параллакса.
Я считаю, что проще использовать 'gravity' вместо' attitude' при поиске основного материала ориентации. Я также просто использовал бы числовые значения (корректируя ограничение 'constant' в автоматическом макете, корректируя значения« frame », если нет), что устраняет все эти операторы if. – Rob
не уверен, что вы подразумеваете под этим. Однако я попытался использовать значения ускорения, но когда я их использовал, кнопка переместилась вниз, когда телефон был опрокинут вперед, но не двигался обратно, пока телефон не вернулся обратно, не встал на прежнее положение. Также я добавляю код, который я использую, чтобы переместить кнопку в моем исходном сообщении. – user1114881
Не могли бы вы дать мне пример того, что вы предлагаете – user1114881