Я использую toolchain для iPhone на Linux, и поэтому у меня нет интерфейса Builder. Итак, как я мог разместить свой вид в моем подклассе ViewController? Например, я хочу, чтобы UITextView находился в середине экрана? Должен ли я сделать это в loadView
или viewDidLoad
. Должен ли я также настроить представление для подкласса ViewController для себя?Программный макет iPhone UIView?
ответ
Непростая работа по компоновке всего вида с использованием кода. Вот некоторый код:
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake (100, 100, 100, 100)];
[self.view addSubview:textView];
Рам этого место (первый и второй аргумент х и у координатора) и размер (третий и четвертый аргумент ширина и высота текстового режима).
Используя этот способ, вы можете добавить любой вид в свой класс. Некоторая часть представления встроена, и вам не нужно рисовать себя, некоторые из них нет, и вам нужно подклассифицировать UIView и переопределить drawRect.
Вы должны сделать это в viewDidLoad, когда ваш главный контроллер представления завершена загрузка
Я обычно строить всю иерархию в методе loadView и выполнить дополнительные настройки в viewDidLoad, например, чтобы установить содержание подвиды в отражают данные, связанные с контроллером представления. Важно установить контроллер вида вид розетка в методе loadView.
@synthesize label; // @property(nonatomic,retain) UILabel *label declared in the interface.
-(void)loadView {
// Origin's y is 20 to take the status bar into account, height is 460 for the very same reason.
UIView *aView = [[UIView alloc]initWithFrame:CGRectMake(0,20,320,460)];
[aView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
[aView setAutoresizeSubviews:YES];
// The 150x50 label will appear in the middle of the view.
UILabel *aLabel = [[UILabel alloc]initWithFrame:CGRectMake((320-150)/2,(460-50)/250,150,50)];
// Label will maintain the distance from the bottom and right margin upon rotation.
[aLabel setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin];
// Add the label to the view hiearchy.
[self setLabel:aLabel];
[aView addSubview:aLabel];
// Set aView outlet to be the outlet for this view controller. This is critical.
[self setView:aView];
// Cleanup.
[aLabel release];
[aView release];
}
-(void)viewDidLoad {
// Additional and conditional setup.
// labelText is an istance variable that hold the current text for the label. This way, if you
// change the label text at runtime, you will be able to restore its value if the view has been
// unloaded because of a memory warning.
NSString *text = [self labelText];
[label setText:text];
}
-(void)viewDidUnload {
// The superclass implementation will release the view outlet.
[super viewDidUnload];
// Set the label to nil.
[self setLabel:nil];
}
Самая большая трудность, вероятно, понимание того, как настройки IB карта для UIView переменные и методы, например, маски автоматического изменения. Ссылки на классы UIView и UIViewController от Apple полны полезной информации.
Я не использую построитель интерфейсов, так что первая строка вашего образца кода даже понадобится? Я знаю, что могу опустить IBOutlet. Могу ли я также опустить объявление свойства и поэтому декларировать синтез? –
Всё зависит. Любой элемент, который вы добавляете в качестве потомка из окна просмотра, сохраняется и освобождается вместе с ним, поэтому это необязательно. Однако, если мне нужно получить доступ к подчиненному объекту в любом месте контроллера, я бы предпочел использовать его как удобную переменную экземпляра и установить его в nil в viewDidUnload и освободить его в dealloc, например, метку в приведенном выше примере. Таким образом, я не получаю указатель на освобожденный объект. Вы также можете просто назначить его вручную или использовать свойство (присваивать) или назначить ему тег и восстановить его при необходимости, но установка его как свойства (сохранения) является более безопасной и чистой imo. – sigsegv
Я написал проект с открытым исходным кодом, который делает именно это:
https://github.com/charlesmchen/WeViews
Вот еще один проект, который вы могли бы оказаться полезными:
Подумайте о том, что много объектов есть свойство «центра». это CGPoint, и это очень полезно, когда вы хотите центрировать объект в пространстве. Это лучше, чем использование свойства frame, где вам нужно вычислить вещи. – Vinzius