2016-03-18 2 views
0

Каков наилучший способ убедиться, что дочерние представления в UIScrollView сложены горизонтально, один за другим, используя автозапуск? Количество просмотров ребенка будет меняться, поэтому я не могу использовать IB, но должен делать это программно. Я понимаю, как работают ограничения компоновки, но каков наилучший способ его решения? Зациклируйте все дочерние представления и обновите ограничения для каждого представления каждый раз, когда обновляется число дочерних представлений? Если это так, есть ли простое решение обратиться к предыдущему родственнику в ограничении макета или мне нужно сохранить ссылку на предыдущего брата?Горизонтальная укладка в scrollview с использованием автозапуска

ответ

0

Я написал следующий метод для приложения. Не может быть самым красивым, но он выполняет свою работу. Он принимает представления как массив, который решает проблему ссылки на предыдущее представление. Он также использует прозрачные проставки, чтобы разместить их равномерно, но вы можете легко их вынуть.

+(void)spaceViews:(NSArray*)views evenlyInContainer:(UIView*)container { 

    UIView* lastSpacer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; 
    lastSpacer.translatesAutoresizingMaskIntoConstraints = NO; 
    [lastSpacer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lastSpacer(10)]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(lastSpacer)]]; 
    [container addSubview:lastSpacer]; 

    [container addConstraint:[NSLayoutConstraint constraintWithItem:container attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:lastSpacer attribute:NSLayoutAttributeLeading multiplier:1.f constant:0]]; 


    for (int i = 0; i < [views count]; i++) { 
     [container addSubview:views[i]]; 

     [container addConstraint:[NSLayoutConstraint constraintWithItem:lastSpacer attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:views[i] attribute:NSLayoutAttributeLeading multiplier:1.f constant:0]]; 

     UIView* spacerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; 
     [spacerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[spacerView(10)]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(spacerView)]]; 


     spacerView.translatesAutoresizingMaskIntoConstraints = NO; 
     [spacerView setBackgroundColor:[UIColor blueColor]]; 
     [container addSubview:spacerView]; 
     [container addConstraint:[NSLayoutConstraint constraintWithItem:spacerView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:views[i] attribute:NSLayoutAttributeTrailing multiplier:1.f constant:0]]; 

     [container addConstraint:[NSLayoutConstraint constraintWithItem:spacerView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:container attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0]]; 

     [container addConstraint:[NSLayoutConstraint constraintWithItem:views[i] attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:container attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0]]; 

     if (lastSpacer) { 
      [container addConstraint:[NSLayoutConstraint constraintWithItem:spacerView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:lastSpacer attribute:NSLayoutAttributeWidth multiplier:1.f constant:0]]; 
     } 
     lastSpacer = spacerView; 
    } 
    [container addConstraint:[NSLayoutConstraint constraintWithItem:lastSpacer attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:container attribute:NSLayoutAttributeTrailing multiplier:1.f constant:0]]; 
}