可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) } }
您可以通过将所需值设置为maxSize
和minSize
来调整最大和最小尺寸。 希望这会有所帮助。
从你的问题来看,你不清楚你想要什么,也不知道你的问题是什么,但是我会根据你的意思来设法回答。
首先 – 这个观点不应该pipe理自己的立场。 视图控制器应该,或者父视图,理想情况下在viewDidLayoutSubviews
或layoutSubviews
视情况而定。 self.center = ...
总是做错事情,因为视图的中心应该取决于其父视图的大小和形状,并且子视图不应该知道关于父视图的事情。
其次,没有像UIView一样的“圆”。 你可以制作一个正方形的UIView
然后掩盖它的图层,使它看起来很圆,用一个圆圈作为其path,使用一个CAShapeLayer
作为圆,然后使用myView.layer.mask = circleShapeLayer
来应用这个蒙版。
要处理交互, PanGestureRecognizer
在父视图上使用PanGestureRecognizer
。 在gestureRecognizerShouldBegin
,确定触摸是否在正确的位置开始相互作用(在圆圈内部?在圆圈半径的顶部?),并返回YES
或NO
。 在您的手势识别器动作函数中,为圆圈计算一个新的大小,并使用myView.bounds = CGRectMake(0, 0, 2*circleRadius, 2*circleRadius);
设置圆形视图的大小myView.bounds = CGRectMake(0, 0, 2*circleRadius, 2*circleRadius);
。
这应该做你需要的。