Логика использования UISlider Xcode - PullRequest
0 голосов
/ 01 июля 2011

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

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

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

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

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

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

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

-Hakimo

Ответы [ 2 ]

0 голосов
/ 01 июля 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 и ... Outside на слайдере.

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

0 голосов
/ 01 июля 2011

Обратите внимание, что Doc говорит о 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);
...