Может ли кто-нибудь опубликовать или указать, как перемещать несколько объектов UIImageView
в зависимости от движения Accelerometer
.Перемещение нескольких UIImageView с помощью UIAccelerometer?
спасибо.
Может ли кто-нибудь опубликовать или указать, как перемещать несколько объектов UIImageView
в зависимости от движения Accelerometer
.Перемещение нескольких UIImageView с помощью UIAccelerometer?
спасибо.
Ребята Apple, обеспечивают эту иллюстрацию того, как «сгладить» сырые данные, поступающие от акселерометра в документации:
#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:
(UIAcceleration *)acceleration {
// Use a basic low-pass filter to keep only the gravity component of each axis.
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
}
После того, как у вас есть поток данных, просто изменить DeltaX, deltay у вас есть для набор изображений, в некоторых минимальных/максимальных диапазонов, и изменить положение каждого UIImageView, например:
// in your @interface somewhere
float deltax, deltay;
UIView* ivs[9];
// in your @implementation
#define MINXDELTA (-40)
#define MAXXDELTA (+40)
#define MINYDELTA (-40)
#define MAXYDELTA (+40)
#define SPEEDFACTOR (5)
#define kFilteringFactor 0.1
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:
(UIAcceleration *)acceleration {
// Use a basic low-pass filter to keep only the gravity component of each axis.
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));
deltax+=accelX*SPEEDFACTOR; deltay+=accelY*SPEEDFACTOR;
if (deltax<MINXDELTA) deltax=MINXDELTA;
if (deltay<MINYDELTA) deltay=MINYDELTA;
if (deltax>MINXDELTA) deltax=MINXDELTA;
if (deltay>MINYDELTA) deltay=MINYDELTA;
[self positionImages];
}
// call this from init too
-(void)positionImages {
// assumes you have 9 images arranged as 3x3 on 40 pixel grid centered at 100,100
for (ix=0; ix<3; ix++) for (iy=0; iy<3; iy++) {
UIImageView *iv=ivs[ix+iy*3];
CGPoint c=CGMakePoint(100-40+40*ix, 100-40+40*iy);
iv.center=c;
}
}
EDIT
Некоторые незначительные опечатки выше.
UIView* ivs[9];
должен быть
UIImageView* ivs[9];
и
if (deltax>MINXDELTA) deltax=MINXDELTA;
if (deltay>MINYDELTA) deltay=MINYDELTA;
должен быть
if (deltax>MAXXDELTA) deltax=MAXXDELTA;
if (deltay>MAXYDELTA) deltay=MAXYDELTA;
Это достаточно указателю/я оставлю его там, я думаю.
благодарит за ответ! можете ли вы объяснить немного больше? как определить изображения здесь, что вызывать в viewdidload? – omri
() * Для этого простого примера изображения и изображения, созданные с помощью [UIImage imageWithContentsOfFile], [UIImageView initWithFrame: CGMakeRect (0,0,0,0)], [UIImageView setImage:] и [someParentView addSubView:] в [ UIApplicationDelegate init] * Обращается к API-интерфейсу акселерометра, чтобы сообщить ему, чтобы он начинал и останавливал вызов. Метод didAccelerate тоже требуется * Если вы используете контрольные контроллеры, вы можете вызвать [appDelegate positionImages] из вашего метода viewController viewDidLoad – martinr
i ' m имеет проблему с методом positionImages: 1. Как объявить ix и iy? 2. Я получаю недействительный инициализатор на этом - UIImageView * iv = ivs [ix + iy * 3]; 3. Я хочу использовать uiimageview, расположенный уже на представлении с помощью ib (для разделения местоположения я не знаю, как это сделать на коде ...). спасибо! btw [appDelegate positionImages] вы имели в виду [self positionImages]? – omri