UIView сенсорный вопрос / вопрос - PullRequest
0 голосов
/ 23 июня 2011

Возникли небольшие проблемы с моим приложением. Я подвергаю сомнению мой подход.

Вот изображение Sample App

В основном мне нужно, чтобы цветовое колесо вращалось в прозрачной коробке. То, что у меня до сих пор работает. Я могу перетащить цветовое колесо, и оно будет вращаться. Проблема в том, что я могу коснуться и перетащить «куда угодно» на экране, и он будет вращаться. Я только хочу, чтобы он вращался в «окне».

Я в основном добавил UIView и UIImageView, добавил выходы в ImageView и добавил код в touchesBegan и touchesMoved для выполнения анимации. Колесо является изображением полного круга, а подпредставления «обрезаны», чтобы не показывать нижнюю половину изображения.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *thisTouch = [touches anyObject];
    delta = [thisTouch locationInView:wheelImage];

    float dx = delta.x  - wheelImage.center.x;
    float dy = delta.y  - wheelImage.center.y;
    deltaAngle = atan2(dy,dx); 

    initialTransform = wheelImage.transform;   
  }

  - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
      UITouch *touch = [touches anyObject];
  CGPoint pt = [touch locationInView:wheelImage];

  float dx = pt.x  - wheelImage.center.x;
  float dy = pt.y  - wheelImage.center.y;
  float ang = atan2(dy,dx);

  //do the rotation
  if (deltaAngle == 0.0) {
    deltaAngle = ang;
    initialTransform = wheelImage.transform;
  }else
  {
    float angleDif = deltaAngle - ang;
    CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif);
    wheelImage.transform = newTrans;

    currentValue = [self goodDegrees:radiansToDegrees(angleDif)];

  }

  }

Сейчас ... Мои вопросы следующие:

  1. Как я могу заставить TouchSMoved / Begin работать ТОЛЬКО в UIView или UIImageView?
  2. Должен ли я создать пользовательский UIView для этого колеса, а затем просто добавить его в мой контроллер основного вида? 2.а Если я создам кастом, у меня будет та же проблема с касаниями?

Ответы [ 3 ]

2 голосов
/ 23 июня 2011

Простое решение - добавить BOOL var, установленный true, когда касание началось в регионе, который вам нравится:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *thisTouch = [touches anyObject];
    CGPoint p = [thisTouch locationInView:wheelImage.superview];
    if (CGRectContainsPoint(wheelImage.frame, p))
    {
      rotating = YES;
      // rest of your code
      ...
    }
}

и

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  if (rotating)
  {
     // your code
  }
}

Не забудьте сбросить rotating в touchesEnded и touchesCanceled.

2 голосов
/ 23 июня 2011

Возможно, вы захотите использовать UISwipeGestureRecognizer и добавить его только в представление, в котором вы хотите распознать пролистывание.

1 голос
/ 23 июня 2011

если вы создадите подкласс UIImageView и поместите в него этот код, вы получите только прикосновения от этого представления, вам, вероятно, потребуется установить значение acceptptsUserInteraction в YES.также измените locationInView: на себя;если вы загружаете из пера, убедитесь, что для этого класса установлен новый подкласс для этого UIImageView.

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