1

我正在寻找一种方法来创建UIView可调整大小并保持居中的 CIRCULAR(见图)。本例中的 CIRCULAR 视图是一个UIView子类WCSDailyGoal

容器视图.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;
}

在此处输入图像描述

4

2 回答 2

3

我能够通过制作自定义视图来实现这种效果(以下代码在 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。希望这会有所帮助。

于 2015-03-17T19:24:24.080 回答
2

从你的问题中,不清楚你想要什么,也不清楚你的问题是什么,但我会根据我对你的意思的假设来尝试回答。

首先 - 视图不应该管理自己的位置。理想情况下,视图控制器或父视图应该在viewDidLayoutSubviewslayoutSubviews适当时。self.center = ...总是做错事,因为视图中心的确切位置取决于其父视图的大小和形状,而子视图不必知道其父视图的这些事情。

其次,没有所谓的“圆形”UIView。您可以制作一个正方形UIView并遮盖其图层,使其显示为圆形,方法是使用CAShapeLayer带有圆形作为其路径的圆形,然后用于myView.layer.mask = circleShapeLayer应用​​遮罩。

要处理交互,PanGestureRecognizer请在父视图上使用 a。在gestureRecognizerShouldBegin中,确定触摸是否在大约正确的位置开始交互(在圆圈内?在圆圈半径上?在顶部的圆圈半径上?),并根据需要返回YESNO。在您的手势识别器操作函数中,计算圆圈的新大小并使用myView.bounds = CGRectMake(0, 0, 2*circleRadius, 2*circleRadius);.

这应该做你需要的。

于 2015-03-26T15:27:53.553 回答