ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

Акселерометр (UIAccelerometer)

Считаю будет лишним описывать, что такое акселерометр и какую роль он выполняет в мобильных устройствах. Вместо этого я расскажу как работать с этим чудом техники. Класс UIAccelerometer является связующим звеном между непосредственно железякой и вашим приложением. Рассмотрим работу этого класса на примере приложения Accelerometer, которое создадим на основе шаблона Single View Application.

Чтобы убедиться в работоспособности нашего приложения добавим объект интерфейса, который будет изменять свое положение в зависимости от наклона устройства. Учитывая все вышеописаное, интерфейс нашего класса будет выглядеть так:

ViewController.h

<code data-result="[object Object]">#define sensitivity 0.01f
#define speed 10.0f

#import &lt;UIKit/UIKit.h&gt;

@interface ViewController : UIViewController &lt;UIAccelerometerDelegate&gt;

@property (strong, nonatomic) IBOutlet UIImageView *square;

@end</code>

В дэфайнах sensitivity и speed мы храним чувствительность устройства к наклону и скорость объекта, который будет перемещаться по экрану. Далее мы подключаем протокол UIAccelerometerDelegate, тем самым указывая, что мы собераемся использовать методы акселерометра. square и есть тот объект интерфейса, который мы будем перемещать (при желании можете подставить ему какую-то картинку). Добавьте в ViewController.xib объект типа UIImageView и свяжите его с square.

 

Теперь перейдем к реализации класса:

ViewController.m

<code data-result="[object Object]">#import "ViewController.h"

@implementation ViewController

@synthesize square;

- (void)viewDidLoad
{
    [super viewDidLoad];

    [UIAccelerometer sharedAccelerometer].updateInterval = 0.01f;
    [UIAccelerometer sharedAccelerometer].delegate = self;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.square = nil;
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    CGFloat minX = square.frame.size.width/2.0f;
    CGFloat maxX = self.view.frame.size.width-minX;
    CGFloat minY = square.frame.size.height/2.0f;
    CGFloat maxY = self.view.frame.size.height-minY;

    CGPoint position = square.center;
    position.x = (fabsf(acceleration.x)&gt;sensitivity)?position.x+acceleration.x*speed:position.x;
    position.y = (fabsf(acceleration.y)&gt;sensitivity)?position.y+acceleration.y*-speed:position.y;

    if (position.x&gt;maxX) position.x = maxX;
    if (position.x&lt;minX) position.x = minX;
    if (position.y&gt;maxY) position.y = maxY;
    if (position.y&lt;minY) position.y = minY;
    square.center = position;
}

@end</code>

В методе viewDidLoad мы устанавливаем частоту с которой хотим получать данные с акселерометра и объект класса, в который эти данные должны возвращаться. Получение данных происходит с помощью метода — (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration, это единственный метод протокола UIAccelerometerDelegate, в котором и начинается все самое интересное. Все опирации этого метода я условно разбил на три части:

  1. Определение границ экрана, за которые не может выходить движущийся объект интерфейса;
  2. Расчет и установка нового положения объекта интерфейса;
  3. Проверка и поправка координат с учетом границ экрана.

 

Следует обратить внимание, что тестирование данного примера на симуляторе не приведет ни к какому результату. Симулятор не поддерживает работу акселерометра.

Comments are closed.