Проблемы с размером CGAffineTransformRotate

Я разрабатываю приложение, которое позволяет пользователю вращать стрелки часов. для этого я использую свойство преобразования изображения иглы:

CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif); minutesNeedle.transform = newTrans;

с целью обнаружения прикосновения пользователя я должен определить пространство иглы (минутный или часовой кадр). И тут моя проблема выпендривается, после поворота изображения оно выглядит так, как будто изображение растягивается и мешает другому изображению. в документации класса UIView говорится, что после преобразования рамка представления изменяется, и вы должны использовать свойства центра и границ. Однако я не могу использовать свойство bounds для обнаружения касаний пользователя, которые находятся в супервизоре.

есть ли другой способ сделать эту анимацию без изменения размера кадра (я сомневаюсь). Или я могу изменить размер кадра в методе touchesEnded (я пытался, но тщетно). Пожалуйста, помогите, я блокирую там в течение одной недели!! Спасибо


person Jazzmanouch    schedule 05.10.2012    source источник


Ответы (2)


Может быть, я что-то упускаю, но похоже, что вы можете вообще избежать этого конфликта. Создайте отдельный вид для обработки касаний, независимый от вида иглы. В событии касания переместите представление стрелки соответствующим образом. Этот отдельный вид будет размером с часы и будет накладываться на другие виды, имея четкий фон. У него будет делегат с соответствующими обратными вызовами, поэтому ваш контроллер представления (или что-то еще, владеющее иглой) может его настроить.

Что касается обратных вызовов, я бы просто перенаправлял события касания, например:

    - (void)touchReceiverView:(TouchReceiverView *)view didReceiveTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
person Matt    schedule 05.10.2012
comment
я не уверен, что понимаю, что вы пытаетесь сказать. Однако я уже пытался создать вид, который будет содержать мою иглу, затем я преобразую вид (а не изображение иглы), размер изображения стоит правильно, но координаты изображения относятся к виду, удерживающему его. поэтому x и y неверны для оси пользователя. Спасибо за ответ - person Jazzmanouch; 06.10.2012
comment
Я имею в виду создать пустой/четкий вид в дополнение к виду, в котором находится игла. Наложите это поверх часов и используйте сенсорные события в этом представлении, чтобы управлять анимацией представления стрелки. - person Matt; 06.10.2012
comment
в методе touchesMoved я проверяю, находится ли пользователь касания в рамке иглы (если (CGRectContainsPoint(needle.frame, touch)). В этом случае, как я могу обнаружить рамку иглы с исходным размером в пустом виде? - person Jazzmanouch; 06.10.2012
comment
У вас должен быть контроллер представления, которому принадлежит представление иглы, а также пустое представление. Контроллер представления будет выполнять преобразования, поэтому он может отслеживать любые кадры, которые вам нужны. Пустое представление перенаправляет события касания в контроллер представления с помощью обратного вызова делегата, это запускает движение стрелки, когда это уместно. Вам нужно будет преобразовать точки из пустого вида в вид иглы при тестировании/расчете. - person Matt; 07.10.2012

Делать это с помощью CALayers НАМНОГО проще, а производительность выше.

CALayer *handLayer = [CALayer layer];
handLayer.contents = (id)[UIImage imageNamed:@"hand.png"].CGImage;
handLayer.anchorPoint = CGPointMake(0.5,0.0)];
[myview.layer addSublayer:handLayer];

//i.e.: if handLayer represents the seconds hand then repeat this every second ;)
handLayer.transform = CGAffineTransformMakeRotation (angle); //set the angle here


Кто-то написал пример ClockView с использованием CALayers, возможно, вы найдете его полезным.

person Suresh Varma    schedule 08.10.2012
comment
Я пробовал это с CALayer, к сожалению, у меня та же проблема. Когда я применяю вращающееся преобразование, размер слоя также меняется! я хочу сохранить тот же размер и местоположение, чтобы точно определить касание пользователя и выполнить вращение, если (CGRectContainsPoint (needle.frame, touch))!! Спасибо - person Jazzmanouch; 08.10.2012