Радиальный набор в Xcode - PullRequest
       2

Радиальный набор в Xcode

0 голосов
/ 07 января 2012

Я пытаюсь сделать приложение, которое использует радиальный циферблат. В качестве примера, функции радиального набора доступны в этом приложении

http://itunes.apple.com/us/app/kitchen-dial/id448558628?mt=8&ign-mpt=uo%3D4

То, что я хотел спросить, это какой метод я должен использовать для достижения этой цели? Ребята, я не прошу вас писать код для меня, я спрашиваю, как это делается концептуально? Я имею в виду, когда пользователь проводит пальцем влево / вправо по экрану, как он узнает, какой радиальный диск нужно перемещать и в каком направлении. Я уверен, что есть несколько кнопок, и здесь происходит некоторый переход изображения. Мне нужно понять концепцию создания такой вещи. Если кто-то знает или сделал что-то подобное, пожалуйста, поделитесь своими мыслями. У Apple есть пример кода для этого? Спасибо.

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Основные понятия:

  • Возможность поворачивать изображение вокруг центральной точки.

  • Возможность расчета угла относительноцентральная точка, заданная координатами x, y.

Итак, чтобы переместить колесо:

  • Началось касание:
    • Рассчитать начальный угол на основе x, y
  • При касании перемещено:
    • Рассчитать новый угол на основе x, y и вычесть начальный угол.Это дельта угла (или на сколько больше повернуть изображение).

Чтобы зарегистрировать нажатия кнопок на колесе:

  • Вкл.нажмите:
    • Рассчитайте угол на основе x, y, добавьте существующее вращение, разделите на размер угла каждого сегмента, чтобы получить индекс.

Вы спросилидля объяснения концепций на высоком уровне - и это почти все.

1 голос
/ 11 октября 2013

Это сложный вопрос. Ответ прост: используйте распознаватель панорамирования с помощью:

- (void)panBegan:(UIPanGestureRecognizer *)pan {
  CGRect frame = [self frame];
  _central = CGPointMake(frame.origin.x+frame.size.width/2, frame.origin.y+frame.size.height/2);
  CGPoint p = [pan locationInView:[self superview]];
  p.x -= _central.x;
  p.y -= _central.y;

  _angle = atan2(p.x, p.y);
}

- (void)panMoved:(UIPanGestureRecognizer *)pan {
  CGPoint p = [pan locationInView:[self superview]]];
  p.x -= _central.x;
  p.y -= _central.y;
  CGFloat deltaAngle = _angle - atan2(p.x, p.y);
  self.transform = CGAffineTransformMakeRotation(deltaAngle + _finalAngle);
}

где _angle - угол начального касания панорамирования, а _finalAngle - сохраненный угол в конце предыдущего панорамирования.

Но: UIPanGestureRecognizer имеет свойство скорости, и вы должны использовать его в конце панорамы, чтобы продолжить вращение, как если бы циферблат имел инерцию. И, если циферблат имеет фиксированный целочисленный набор допустимых остановочных положений, то вы должны настроить кривую замедления так, чтобы она остановилась на допустимом остановке. И, если вы анимируете замедление, и пользователь запускает новый панорамирование до того, как предыдущий будет закончен, тогда вы должны настроить _finalAngle на основе воспринимаемой позиции, а не сохраненной позиции.

0 голосов
/ 07 января 2012

Вот список вращающихся ручек с открытым исходным кодом, так что вы можете посмотреть на код и посмотреть, что с ним связано:

http://maniacdev.com/2011/12/open-source-libraries-for-easily-adding-rotary-knob-controls-in-your-ios-apps/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...