Логика использования UISlider Xcode

Я застрял в данный момент, управляя UISlider в XCode. Я сделал горизонтальный слайдер в Интерфейсном Разработчике и смог закодировать элементы управления в xcode. Прямо сейчас я просто не уверен, как кодировать логику. Если пользователь перемещает перо влево, я бы хотел, чтобы мое изображение повернулось против часовой стрелки, а если пользователь сдвинет его вправо, повернуть изображение по часовой стрелке.

Минимальное значение ползунка, которое я установил, равно 0, а максимальное - 100. Начальное значение - 50.

Для трансформации я использую CGAffineTransformMakeRotation (myAngle). Я установил для myAngle значение float. Что касается условия, вот фрагмент кода:

mySlider.value = myAngle; // This is for CGAffine

if(myAngle < 50) {
   myAngle -= 0.1;
}

if(myAngle > 50) {
   myAngle += 0.1;
}

Когда я сдвигаю перо, оно вращается только против часовой стрелки. Какую лучшую логику я могу использовать? Надеюсь, кто-то может помочь. Спасибо.

-Хакимо


person hakimo    schedule 01.07.2011    source источник


Ответы (2)


Обратите внимание, что В документе говорится о angle as,

Угол в радианах, на который эта матрица поворачивает оси системы координат. В iOS положительное значение указывает вращение против часовой стрелки, а отрицательное значение указывает вращение по часовой стрелке. В Mac OS X положительное значение указывает вращение по часовой стрелке, а отрицательное значение указывает вращение против часовой стрелки.

Я думаю, что что-то вроде следующего должно работать. Хотя я не уверен. (Учитывая, что минимальное значение равно 0).

float middleValue = slider.maximumValue / 2;
float value = middleValue - slider.value;
float degrees = (middleValue / 180) * value;
float radians = degrees * (3.14/180);
person EmptyStack    schedule 01.07.2011
comment
Привет, EmptyStack, спасибо за ответ. Я тестировал идею, которую вы показали. Думаю, у меня нет проблем с радианами и углами. Я могу повернуть изображение против часовой стрелки, когда я перемещаю ползунок влево, но оно не движется по часовой стрелке, когда я перемещаю ползунок вправо. Мне не хватает того, как закодировать логику: если отрицательное значение - против часовой стрелки, если положительное значение - по часовой стрелке. Я знаю, что в iOS все по-другому, но я просто не мог понять логику, чтобы повернуть его в 2 направления. Еще раз спасибо - Хакимо - person hakimo; 05.07.2011

Если вы хотите, чтобы фиксированное положение ползунка соответствовало фиксированному углу поворота, вы можете сделать что-то вроде этого:

float degreesToRadians = M_PI / 180.0;
CGFloat angle = (mySlider.value - 50) * degreesToRadians;
myView.transform = CGAffineTransformMakeRotation(angle);

С другой стороны, если вы хотите более сложное поведение, например, когда ползунок привязывается к середине, кроме случаев, когда его перетаскивают, и то, как далеко он перетаскивается, определяет скорость вращения вашего представления, тогда я бы предложил использовать таймер. Настройте NSTimer для вызова данного селектора и сделайте в этом селекторе что-то вроде этого:

- (void)timerFired:(NSTimer *)aTimer {
  CGFloat angleDelta = (mySlider.value - 50) / 500;
  // I'll assume myAngle is an instance variable.
  myAngle += angleDelta;
  myView.transform = CGAffineTransformMakeRotation(myAngle);
}

И где-то еще вам нужно написать метод для установки mySlider.value = 50, когда пользователь перестанет перетаскивать его, что вы можете сделать, добавив цель / действие для UIControlEventTouchUpInside и ..._ 6_ на ползунке.

Если вы хотите, вы можете сделать вращение очень плавным, используя UIView анимацию каждый раз, когда вы устанавливаете преобразование, используя продолжительность анимации, равную интервалу NSTimer. Если вы это сделаете, я бы фактически предложил использовать обратный вызов анимации вместо метода таймера, чтобы избежать любого возможного пересечения между двумя событиями.

person Tyler    schedule 01.07.2011