1

我在 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 无处可见。我想知道使用自动布局我应该为这样的事情做些什么。是否需要先添加一个在viewController的view和tableView之间创建空间的约束,然后再添加activityIndi​​cator?或者我是否创建一个看起来像的新约束

"@V:|-[activityIndicator]-[tableView]|"

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

4

2 回答 2

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];
        }];
    }
}
于 2013-09-24T05:09:05.600 回答
0

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

并确定您遇到的问题。

  1. 它是否与您的 AI 的框架、位置或大小有关(大小 = 0,或者 AI 框架超出范围)。
  2. 也许您只需要通过 [self.view setNeedsDisplay] 刷新视图;

我在 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;   }
于 2013-09-24T05:59:16.007 回答