3

我想在主 UIView 中水平居中一些 UIViews(它们恰好是圆圈)。它最终基本上看起来像标准页面控件上的点。

我已经编写了所有代码来创建圆形 UIViews 我只是不知道如何在运行时水平和动态地排列它们。

基本上我需要某种水平容器,我可以做到这一点

-(void)addCircle{
  [self addSubView:[CircleView init]];
}

它会自动安排中心有多少孩子。

4

3 回答 3

11

我有时也会对自动布局感到困惑,但这是一种以编程方式进行的方法:(我假设您将圆形视图添加到containerView视图控制器的属性中,并且您没有添加任何其他视图到它。)

  1. 将这两个属性添加到您的视图控制器:

    @property (nonatomic) CGRect circleViewFrame;
    @property (nonatomic) CGFloat delta;
    
  2. viewDidLoad在视图控制器的方法中使用所需的值启动这些属性:

    // the size (frame) of your circle views
    self.circleViewFrame = CGRectMake(0, 0, 10, 10);
    // the horizontal distance between your circle views
    self.delta = 10.0;
    
  3. 现在我们添加您的“自动 addCircle 方法”:

    - (void)addCircleView {
      UIView *newCircleView = [self createCircleView];
      [self.containerView addSubview:newCircleView];
      [self alignCircleViews];
    }
    
  4. 当然我们需要实现这个createCircleView方法...

    - (UIView*)createCircleView {
      // Create your circle view here - I use a simple square view as an example
      UIView *circleView = [[UIView alloc] initWithFrame:self.circleViewFrame];
      // Set the backgroundColor to some solid color so you can see the view :)
      circleView.backgroundColor = [UIColor redColor];
    
      return circleView;
    }
    
  5. ...和alignCircleViews方法:

    - (void)alignCircleViews {
      int numberOfSubviews = [self.containerView.subviews count];
      CGFloat totalWidth = (numberOfSubviews * self.circleViewFrame.size.width) + (numberOfSubviews - 1) * self.delta;
      CGFloat x = (self.containerView.frame.size.width / 2) - (totalWidth / 2);
    
      for (int i = 0; i < numberOfSubviews; i++) {
          UIView *circleView = self.containerView.subviews[i];
          circleView.frame = CGRectMake(x,
                                  self.circleViewFrame.origin.y,
                                  self.circleViewFrame.size.width,
                                  self.circleViewFrame.size.height);
          x += self.circleViewFrame.size.width + self.delta;
      }
    }
    

这是最重要的方法,它会在每次添加新的 circleView 时自动重新对齐所有子视图。结果将如下所示:

具有 3 个水平居中子视图的示例视图控制器 具有 8 个水平居中子视图的示例视图控制器

于 2013-10-29T23:52:00.137 回答
0

简单步骤:将圆圈附加到容器视图、调整容器视图大小、居中对齐容器视图

-(void)addToContanerView:(CircleView*)circle{

    circle.rect.frame = CGrectMake(containers_end,container_y,no_change,no_change);
    [containerView addSubview:circle];
    [containerView sizeToFit];
    containerView.center = self.view.center;
}

假设:containers_end & containers_y 你可以从 CGRectMax 函数中获得,对于 UIView SizeToFit 方法检查here

要注意旋转使用,请确保您的 Autoresizing 子视图设置为左、右下角和上边距。

于 2013-10-30T01:23:42.507 回答
0

你可以尝试使用这个库。我已经在我的几个项目中使用了它,到目前为止,它运行得非常好。

https://github.com/davamale/DMHorizo​​ntalView

于 2016-04-12T02:28:46.147 回答