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);
,
Это должно делать то, что вам нужно.