使用自动布局在UITableView上添加UIView

时间:2013-09-24 03:48:24

标签: ios autolayout

我在UIViewController中有一个占用整个屏幕的UITableView。它的约束只是水平和垂直空间,其超常视图的常量为0。 (我基本上只是将tableView放在ViewController的中心)并让Xcode添加了缺少的约束。

我想要做的是在UITableView上向下滑动动画,然后在tableView上面添加一个activityIndi​​cator,旋转,然后在我的任务完成后,将tableView动画回来。

这是我到目前为止所做的:

- (void)revealUnderTableView:(UITapGestureRecognizer *)gesture {
    NSLog(@"show");

    self.activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectZero];
    [self.activityIndicator setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self.view addSubview:_activityIndicator];
    NSLayoutConstraint *constraintW = [NSLayoutConstraint constraintWithItem:_activityIndicator attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1 constant:200];
    NSLayoutConstraint *constraintH = [NSLayoutConstraint constraintWithItem:_activityIndicator attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1 constant:200];
    [self.view addConstraints:[NSArray arrayWithObjects:constraintW, constraintH, nil]];
    //    [_activityIndicator setConstrainedView:_activityIndicator width:100 height:100];
    [_activityIndicator setTintColor:[UIColor redColor]];

    self.tableViewHeightConstraint.constant = 44.;    // 1
    [self.tableView setNeedsUpdateConstraints];  // 2
    [UIView animateWithDuration:.3 animations:^{
        [self.tableView layoutIfNeeded]; // 3
    }];
    NSLog(@"%@", NSStringFromCGRect(self.activityIndicator.frame));
}

我的activityIndi​​cator无处可见。我想知道我应该用Auto Layout做些什么。我是否需要首先添加一个约束,在viewController的视图和tableView之间创建空间,然后添加activityIndi​​cator?或者我创建一个类似于

的新约束
"@V:|-[activityIndicator]-[tableView]|"

我之前尝试过这样的事情,但也没有结果。有人知道如何使用自动布局解决此问题吗?我只用字符串和struts做过这样的事情。谢谢!

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。一种方法是在表视图上方添加UIView,并为超视图的顶部和侧面提供约束,为表视图顶部提供0长度间距约束,以及高度约束。将IBOutlets设置为此视图及其高度约束(在我的示例中,我将它们称为aiView和heightCon)。在IB中编辑高度约束以使其高度为0,这将使该视图消失,并且表视图占据整个屏幕。在代码中,当您创建活动指示器时,将其添加到此视图并为其提供centerX和centerY约束。要使其显示和消失,您只需要更改该高度约束。在我的例子中,我通过手势识别器的连续双击来切换该高度 - 您需要根据自己的需要进行更改。

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (weak, nonatomic) IBOutlet UIView *aiView;
@property (strong,nonatomic) UIActivityIndicatorView *activityIndicator;
@property (strong,nonatomic) IBOutlet NSLayoutConstraint *heightCon;

@end

@implementation ViewController


-(void)viewDidLoad {
    [super viewDidLoad];
    self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [self.activityIndicator setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.aiView addSubview:_activityIndicator];

    NSLayoutConstraint *aiCenterX = [NSLayoutConstraint constraintWithItem:self.activityIndicator attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:self.aiView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
    NSLayoutConstraint *aiCenterY = [NSLayoutConstraint constraintWithItem:self.activityIndicator attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:self.aiView attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
    [self.aiView addConstraints:@[aiCenterX, aiCenterY]];
}

- (IBAction)handleDoubleTap:(UITapGestureRecognizer *)sender {
    if (! self.activityIndicator.isAnimating) {
        [UIView animateWithDuration:.6 animations:^{
            self.heightCon.constant = 100;
            [self.view layoutIfNeeded];
            [self.activityIndicator startAnimating];
        }];
    }else{
        [UIView animateWithDuration:.6 animations:^{
            self.heightCon.constant = 0;
            [self.activityIndicator stopAnimating];
            [self.view layoutIfNeeded];
        }];
    }
}

答案 1 :(得分:0)

我注意到你最初用CGRectZero分配了活动指示器,这意味着0宽度和0高度,然后继续定义一个约束,放置恒定的宽度和高度200.我相信你需要做的是设置一个这一行的断点 - > [_activityIndi​​cator setTintColor:[UIColor redColor]];

并确定您遇到的问题。

  1. 是否与AI的帧,位置或大小有关(大小= 0,或AI帧超出范围)。
  2. 也许您只需要刷新视图 [self.view setNeedsDisplay];
  3. 我在NIB中使用自动布局 - 此时我不知道我是在处理iPhone4还是iPhone 5,但在代码中信息已经可用,在这种情况下它将更容易和更高效只需手动计算帧,如下所示:

     float ai_y = self.view.frame.size.height;
     float ai_x = self.view.frame.size.width;
     CGRect AIrect = CGRectmake (((ai_x / 2) - 100), ((ai_y / 2) - 100), 200,200);
     self.activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:AIRect];
     [_activityIndicator setTintColor:[UIColor redColor]];
     [self.view addSubview:self.activityIndicator];
    [UIView animateWithDuration:.6 animations:^{
        self.aiHeight.constant = 100;
        [self.activityIndicator startAnimating];
        }];
    

    我假设您知道当您通过按钮或手势停止动画时必须从(视图)超级视图中删除AI:

       - (IBAction)Stop_ai:(id)Sender {   
          [self.activityIndicator stop];
          [[[self.view subviews] objectAtIndex:0] removeFromSuperview];  // assumes AI is last subview added
          self.activityIndicator = nil;
          return;   }