Внедрение автоматического макета для представлений, сгенерированных программным способом

У меня есть приложение, чьи представления генерируются программно. Пример:

-(void)loadView
{
    [super loadView];

// SET TOP LEFT BTN FOR NEXT VIEW
UIBarButtonItem *topLeftBtn = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = topLeftBtn;
[topLeftBtn release];

// programmatically set up the view for cart tableView
CGRect iouTableViewFrame = CGRectMake(0, 0, 320, 348);
iouTableView = [[UITableView alloc]initWithFrame:iouTableViewFrame style:UITableViewStylePlain];
[[self iouTableView] setDelegate:self];
[[self iouTableView] setDataSource:self];
[[self view] addSubview:iouTableView];

// set up the summary label
CGRect summaryTableFrame = CGRectMake(0, 348, 320, 18);
UILabel *summaryTableLabel = [[UILabel alloc] initWithFrame:summaryTableFrame];
[summaryTableLabel setFont:[UIFont fontWithName:@"Helvetica" size:14]];
[summaryTableLabel setText:@"   Summary"];
UIColor *labelColor = UIColorFromRGB(MiddleBlueColor);
[summaryTableLabel setBackgroundColor:labelColor];
[summaryTableLabel setTextColor:[UIColor whiteColor]];
[[self view] addSubview:summaryTableLabel];

// set up the summary table
CGRect summaryTableViewFrame = CGRectMake(0, 366, 320, 44);
summaryTableView = [[UITableView alloc]initWithFrame:summaryTableViewFrame style:UITableViewStylePlain];
[summaryTableView setScrollEnabled:NO];
[[self summaryTableView] setDelegate:self];
[[self summaryTableView] setDataSource:self];
[[self view] addSubview:summaryTableView];
}

Да. Я буду обновлять NIB и использовать интерфейс-конструктор и раскадровку в будущем, но я не программировал ios через год.

С новым iPhone 5, имеющим другой размер экрана, приложение просто выглядит не очень хорошо, и мне нужно реализовать автоматическую компоновку. Есть ли способ сделать это программно на данный момент вместо использования IB?

Спасибо большое!

Ответ 1

Да, с помощью двух методов в NSLayoutConstraint

-(NSArray*)constraintsWithVisualFormat:options:metrics:views:
-(NSLayoutConstraint*)constraintWithItem:attribute:relatedBy:toItem:attribute:
    multiplier:constant:

Язык визуального формата упакован в NSString Поэтому я возьму ваш iouTableView, например.

[self.view addConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"|[iouTableView]|" 
    options:0 
    metrics:nil 
    views:NSDictionaryOfVariableBindings(iouTableView)]];

Символ трубы "|" представляет край супервизора. [] Представляют представление. Итак, что мы там сделали, мы привязали левый и правый края iouTableView к левому и правому краю своего супервизора.

Другой пример визуального формата: Позвольте подключить таблицу, сводную метку и сводную таблицу вертикально.

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
    @"V:|[iouTableView(348)][summaryTableLabel(18)][summaryTableView(44)]"
    options:NSLayoutFormatAlignAllLeft
    metrics:nil
    views:NSDictionaryOfVariableBindings(iouTableView, summaryTableLabel, summaryTableView)]];

Теперь это связывает все три вида по вертикали на каждом их краях, NSLayoutFormatAlignAllLeft сообщает обоим представлениям выравнивание влево, и они будут делать это на основе других ограничений, в данном случае предыдущих ограничений. Параметры() s используются для указания размеров представлений.

Там немного больше похоже на неравенства и приоритеты, а также на символ "-", но просмотрите документы Apple для этого

Изменить: Исправлены примеры использования ограниченийWithVisualFormat, как показано в сигнатуре метода.

Ответ 2

В дополнение к предоставленным Aplle методам вы можете использовать Parus lib для работы с AutoLayout из кода.

Например, вы сможете указать:

PVVFL(@"[view1]-20-[view2]").fromRightToLeft.withViews(views).asArray

Вместо

[NSLayoutConstraint constraintsWithVisualFormat:@"[view1]-20-[view2]"
                                        options:NSLayoutFormatDirectionRightToLeft
                                        metrics:nil
                                          views:views]

Также вы сможете группировать настройки макетов, смешивать VFL, а не ограничения VFL. Parus, способный предотвращать распространенные ошибки, различать местоположение и параметры constriaints и обеспечивать отличную поддержку автоматического завершения.