Resizable по центру круговой UIView

Я ищу способ создать круговой UIView это изменяемый размер и остается в центре (см. изображение). Круговое представление в этом примере UIView подкласс WCSDailyGoal,

ContainerView.m

- (void)createDailyGoalView
{
    _dailyGoalView = [[WCSDailyGoalView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    _dailyGoalView.delegate = self;
    _dailyGoalView.goal = 200;
    _dailyGoalView.center = self.view.center;
    [self.view addSubview:_dailyGoalView];
}

WCSDailyGoal.m

- (void)setGoal:(CGFloat)goal
{
    CGPoint saveCenter = self.center;
    CGRect newFrame = CGRectMake(self.frame.origin.x, self.frame.origin.y, goal, goal);
    self.frame = newFrame;
    self.layer.cornerRadius = goal / 2.0;
    self.center = saveCenter;
}

2 ответа

Мне удалось добиться этого эффекта, создав пользовательский вид (следующий код написан на swift):

class ResizableCircleView: UIView {

   var maxSize: CGFloat = 100
   var minSize: CGFloat = 10

   private var dragRecognizer: UIPanGestureRecognizer!
   private var currentScale: CGFloat = 1

   private var defaultSize: CGFloat { return frame.width / currentScale }

   override func layoutSubviews() {
      super.layoutSubviews()
      if dragRecognizer == nil{
         dragRecognizer = UIPanGestureRecognizer(target: self, action: "handleDrag:")
         addGestureRecognizer(dragRecognizer)
      }
      backgroundColor = UIColor.blackColor()
      layer.cornerRadius = frame.width / 2
      clipsToBounds = true
   }

   func handleDrag(recognizer: UIPanGestureRecognizer){
      let inTopArea = recognizer.locationInView(self).y < frame.height / 2
      let dy = recognizer.translationInView(self).y

      var newSize = frame.height + (inTopArea ? -1 : 1) * dy
      newSize = min(maxSize, newSize)
      newSize = max(minSize, newSize)
      currentScale = newSize/defaultSize
      transform = CGAffineTransformMakeScale(currentScale, currentScale)

      recognizer.setTranslation(CGPointZero, inView: self)
   }
}

Вы можете настроить максимальный и минимальный размеры, установив желаемые значения maxSize а также minSize, Надеюсь, это поможет.

Из твоего вопроса не ясно, что именно ты хочешь, и какова твоя проблема, но я постараюсь ответить на это, основываясь на моих предположениях о том, что ты имеешь в виду.

Прежде всего - представление не должно управлять своей позицией. Контроллер представления должен, или родительское представление, в идеале в viewDidLayoutSubviews или же layoutSubviews по мере необходимости. self.center = ... это всегда неправильно, потому что именно то, где должен находиться центр представления, зависит от размера и формы его родительского представления, и дочернее представление не должно знать такие вещи о своем родителе.

Во-вторых, нет такого понятия, как "круглый" UIView. Вы можете сделать квадрат UIView и замаскировать его слой, чтобы он казался круглым, делая круг, используя CAShapeLayer с кругом в качестве пути, затем используйте myView.layer.mask = circleShapeLayer применить маску.

Для обработки взаимодействия используйте PanGestureRecognizer на родительском представлении. В gestureRecognizerShouldBegin, определите, находится ли касание примерно в правильном месте, чтобы начать взаимодействие (внутри круга? на радиусе окружности? на радиусе окружности вверху?), и возвратите YES или же NO по мере необходимости. В вашей функции действия распознавателя жестов рассчитайте новый размер для круга и установите размер кругового обзора, используя myView.bounds = CGRectMake(0, 0, 2*circleRadius, 2*circleRadius);,

Это должно делать то, что вам нужно.

Другие вопросы по тегам