2015-10-20 9 views
1

В моей раскадровке есть один контроллер представления, содержащий UIScrollView. Я хочу добавить какой-то пользовательский вид (каждый вид будет содержать метку &) программному прокрутку в viewController. Я установил ограничения для UIScrollView в раскадровке, но стараюсь добавлять пользовательские представления с ограничениями. Как я могу сделать это, чтобы он отображался как один и тот же для всех устройств (iPhone/iPad)? Я пробовал, как показано ниже, но он, похоже, не работает.Как добавить пользовательский вид с автоматическим автонастройством программно

В Мой ViewController.m -

#import "MainViewController.h" 

#define DEFAULT_ROW_HEIGHT 50 

@interface MainViewController() 

@property float topMarginFromUpperView; 

@end 

@implementation MainViewController 

-(void) addCustomRowToView { 
    self.topMarginFromUpperView += DEFAULT_ROW_HEIGHT + 10.0f; 
    UIView *customRow = [[UIView alloc] initWithFrame:self.scrollView.bounds]; 
    customRow.backgroundColor = [UIColor redColor]; 
    [self.scrollView addSubview:customRow]; 

    customRow.translatesAutoresizingMaskIntoConstraints = NO; 

    [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:customRow attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeTop multiplier:1.0f constant:self.topMarginFromUpperView]]; 
    [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:customRow attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeLeading multiplier:1.0f constant:10.0f]]; 
    [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:customRow attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-10.0f]]; 
    [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:customRow attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeHeight multiplier:0.1f constant:0.0f]]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.topMarginFromUpperView = 0.0f; 
    for (NSInteger i =0; i< 10; i++) { 
     [self addCustomRowToView]; 
    } 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

EDITED:

Все еще борется с ограничением настройки. Ошибка приложения из-за недействительного ограничения. Пробовал, как показано ниже -

-(void) setConstraints:(UIView *)customRow { 

    [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:customRow attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeTop multiplier:1.0f constant:self.topMarginFromSuperView]]; 
    [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:customRow attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeLeading multiplier:1.0f constant:10.0f]]; 
    [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:customRow attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-10.0f]]; 
    [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:customRow attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeHeight multiplier:0.1f constant:0.0f]]; 
} 

-(void) addCustomRowToView { 
    UIView *customRow = [[UIView alloc]initWithFrame:CGRectMake(DEFAULT_PADDING, self.topMarginFromSuperView, self.view.bounds.size.width - 2*DEFAULT_PADDING, DEFAULT_ROW_HEIGHT)]; 
    customRow.backgroundColor = [UIColor redColor]; 
    customRow.translatesAutoresizingMaskIntoConstraints = NO; 

    [self setConstraints:customRow]; 

    [self.scrollView addSubview:customRow]; 
    self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, self.topMarginFromSuperView + DEFAULT_ROW_HEIGHT); 
    self.topMarginFromSuperView += DEFAULT_ROW_HEIGHT + DEFAULT_PADDING; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.topMarginFromSuperView = 0.0f; 
    //for (NSInteger i =0; i< 10; i++) { 
     [self addCustomRowToView]; 
    // } 
    } 

@end 
+0

Это [ссылка] (http://stackoverflow.com/questions/21934558/how-to-set-subviews-with -autolayout-in-uiscrollview-programatically) может помочь вам. –

ответ

1

Вот решение вашей проблемы:

- (void)addCustomView 
{ 
    UIView *lastView; 
    for (int i = 0; i<10; i++) 
    { 
     UIView *view = [[UIView alloc] init]; 
     view.backgroundColor = i%2 ? [UIColor redColor] : [UIColor greenColor]; 
     view.translatesAutoresizingMaskIntoConstraints = NO; 
     [self.scrollView addSubview:view]; 
     [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]]; 
     [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeWidth multiplier:1 constant:-20.0]]; 

     if (i == 0) 
     { 
      [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view(40)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]]; 

     } 
     else 
     { 
      [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lastView(40)]-10-[view(40)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(lastView,view)]]; 
     } 
     lastView = view; 
    } 
    [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lastView(40)]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(lastView)]]; 
} 
+0

Спасибо за помощь. К сожалению, ваше решение не работает для меня. Получение ошибки как «Завершение приложения из-за неперехваченного исключения» NSInvalidArgumentException », причина:« Невозможно разобрать формат ограничения: Обнаруженная метрика с именем «ширина», но значение не было указано в метриках или просмотрах словарей H: | [view (width)] | « – Nuibb

+0

ну, вам нужно изменить« width »/« height »с целым значением. –

+0

@Nuibb Вы попробовали еще раз? –