我在UIViewController中有一个占用整个屏幕的UITableView。它的约束只是水平和垂直空间,其超常视图的常量为0。 (我基本上只是将tableView放在ViewController的中心)并让Xcode添加了缺少的约束。
我想要做的是在UITableView上向下滑动动画,然后在tableView上面添加一个activityIndicator,旋转,然后在我的任务完成后,将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));
}
我的activityIndicator无处可见。我想知道我应该用Auto Layout做些什么。我是否需要首先添加一个约束,在viewController的视图和tableView之间创建空间,然后添加activityIndicator?或者我创建一个类似于
的新约束"@V:|-[activityIndicator]-[tableView]|"
我之前尝试过这样的事情,但也没有结果。有人知道如何使用自动布局解决此问题吗?我只用字符串和struts做过这样的事情。谢谢!
答案 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.我相信你需要做的是设置一个这一行的断点 - > [_activityIndicator setTintColor:[UIColor redColor]];
并确定您遇到的问题。
我在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; }