我正在寻找一种方法来创建一个可调整大小且保持居中的CIRCULAR UIView
(参见图像)。此示例中的CIRCULAR视图是UIView
子类WCSDailyGoal
。
- (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];
}
- (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;
}
答案 0 :(得分: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
来调整最大和最小尺寸。希望这会有所帮助。
答案 1 :(得分:2)
从你的问题来看,目前尚不清楚你想要什么,也不清楚你的问题是什么,但我会根据你对你的意思的假设来回答它。
首先 - 视图不应该管理自己的位置。视图控制器或父视图应理想地位于viewDidLayoutSubviews
或layoutSubviews
中。 self.center = ...
总是做错事,因为视图中心的确切位置取决于其父视图的大小和形状,而子视图不应该知道这样有关其父母的事情。
其次,没有“圆形”UIView这样的东西。您可以制作一个正方形UIView
并使其显示为圆形,方法是使用带圆圈的CAShapeLayer
制作圆圈作为路径,然后使用myView.layer.mask = circleShapeLayer
应用蒙版。
要处理交互,请在父视图上使用PanGestureRecognizer
。在gestureRecognizerShouldBegin
中,确定触摸是否位于开始交互的正确位置(圆圈内?圆顶半径?位于顶部的圆半径?),然后返回YES
或{{ 1}}视情况而定。在手势识别器动作功能中,计算圆的新大小并使用NO
设置圆形视图的大小。
这应该做你需要的。