2013-09-24 4 views
1

У меня есть UITableView в UIViewController, который занимает весь экран. Это ограничения - это просто горизонтальные и вертикальные пространства, которые имеют константы 0 для супервизора. (Я просто просто потерял таблицуView в центре ViewController), и Xcode добавил недостающие ограничения.Добавление UIView над UITableView с автоматической компоновкой

Что я хочу сделать, так это сделать анимацию слайд вниз по UITableView, а затем добавить ActivityIndicator над tableView, вращение, а затем, когда моя задача будет выполнена, анимируйте 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]|" 

Я пробовал что-то подобное раньше, и у меня также не было никаких результатов. Кто-нибудь знает, как подойти к этой проблеме с помощью Auto Layout? Я только делал такие вещи со строками и стойками. Благодаря!

+0

Если можно просто использовать 'tableHeaderView'. –

ответ

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]; 
     }]; 
    } 
} 
0

Я заметил, что вы первоначально выделенный индикатор активности с CGRectZero, что означает ширину 0 и 0 высоту, а затем продолжил определять ограничение размещения постоянную ширину и высоту 200. Я считаю, что вам нужно сделать - установить точку останова в этой строке -> [_activityIndicator setTintColor: [UIColor redColor]];

и определить, какая у вас проблема.

  1. Связано это с рамой, положением или размером вашего ИИ (размер = 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; } 
Смежные вопросы