首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可阻中心圆UIView

可阻中心圆UIView
EN

Stack Overflow用户
提问于 2015-03-17 18:47:54
回答 2查看 1.3K关注 0票数 1

我正在寻找一种方法,以创建一个循环UIView是可调整大小和保持中心(见图像)。本例中的循环视图是一个UIView子类WCSDailyGoal

ContainerView.m

代码语言:javascript
复制
- (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

代码语言:javascript
复制
- (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;
}

EN

回答 2

Stack Overflow用户

发布于 2015-03-17 19:24:24

我通过创建自定义视图(以下代码是快捷的)实现了这一效果:

代码语言:javascript
复制
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来调整最大值和最小大小。希望这能帮上忙。

票数 3
EN

Stack Overflow用户

发布于 2015-03-26 15:27:53

从你的问题上看,不清楚你到底想要什么,也不清楚你的问题是什么,但我会根据我对你的意思的假设来回答它。

首先,这个观点不应该管理自己的立场。视图控制器应该,或父视图,最好是在viewDidLayoutSubviewslayoutSubviews中(视情况而定)。self.center = ...总是错误的,因为视图的中心到底在哪里取决于它的父视图的大小和形状,而子视图不应该知道它的父视图的这些事情。

第二,没有所谓的“一轮”UIView。您可以制作一个正方形的UIView并屏蔽它的层,这样它就会出现圆形,使用一个以圆圈为路径的CAShapeLayer,然后使用myView.layer.mask = circleShapeLayer来应用这个掩码。

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

这应该能满足你的需要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29107305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档