Внедрение автоматического макета для представлений, сгенерированных программным способом
У меня есть приложение, чьи представления генерируются программно. Пример:
-(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 и обеспечивать отличную поддержку автоматического завершения.