可resize的圆形UIView

我正在寻找一种方法来创build一个可resize并保持居中的CIRIVULAR UIView见图 )。 这个例子中的CIRCULAR视图是一个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; } 

在这里输入图像说明

我可以通过自定义视图来实现这个效果(下面的代码是在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) } } 

您可以通过将所需值设置为maxSizeminSize来调整最大和最小尺寸。 希望这会有所帮助。

从你的问题来看,你不清楚你想要什么,也不知道你的问题是什么,但是我会根据你的意思来设法回答。

首先 – 这个观点不应该pipe理自己的立场。 视图控制器应该,或者父视图,理想情况下在viewDidLayoutSubviewslayoutSubviews视情况而定。 self.center = ... 总是做错事情,因为视图的中心应该取决于其父视图的大小和形状,并且子视图不应该知道关于父视图的事情。

其次,没有像UIView一样的“圆”。 你可以制作一个正方形的UIView然后掩盖它的图层,使它看起来很圆,用一个圆圈作为其path,使用一个CAShapeLayer作为圆,然后使用myView.layer.mask = circleShapeLayer来应用这个蒙版。

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

这应该做你需要的。