2010-09-25 6 views
1

Я использую toolchain для iPhone на Linux, и поэтому у меня нет интерфейса Builder. Итак, как я мог разместить свой вид в моем подклассе ViewController? Например, я хочу, чтобы UITextView находился в середине экрана? Должен ли я сделать это в loadView или viewDidLoad. Должен ли я также настроить представление для подкласса ViewController для себя?Программный макет iPhone UIView?

+0

Подумайте о том, что много объектов есть свойство «центра». это CGPoint, и это очень полезно, когда вы хотите центрировать объект в пространстве. Это лучше, чем использование свойства frame, где вам нужно вычислить вещи. – Vinzius

ответ

2

Непростая работа по компоновке всего вида с использованием кода. Вот некоторый код:

UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake (100, 100, 100, 100)]; 
[self.view addSubview:textView]; 

Рам этого место (первый и второй аргумент х и у координатора) и размер (третий и четвертый аргумент ширина и высота текстового режима).

Используя этот способ, вы можете добавить любой вид в свой класс. Некоторая часть представления встроена, и вам не нужно рисовать себя, некоторые из них нет, и вам нужно подклассифицировать UIView и переопределить drawRect.

Вы должны сделать это в viewDidLoad, когда ваш главный контроллер представления завершена загрузка

0

Я обычно строить всю иерархию в методе 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 полны полезной информации.

+0

Я не использую построитель интерфейсов, так что первая строка вашего образца кода даже понадобится? Я знаю, что могу опустить IBOutlet. Могу ли я также опустить объявление свойства и поэтому декларировать синтез? –

+0

Всё зависит. Любой элемент, который вы добавляете в качестве потомка из окна просмотра, сохраняется и освобождается вместе с ним, поэтому это необязательно. Однако, если мне нужно получить доступ к подчиненному объекту в любом месте контроллера, я бы предпочел использовать его как удобную переменную экземпляра и установить его в nil в viewDidUnload и освободить его в dealloc, например, метку в приведенном выше примере. Таким образом, я не получаю указатель на освобожденный объект. Вы также можете просто назначить его вручную или использовать свойство (присваивать) или назначить ему тег и восстановить его при необходимости, но установка его как свойства (сохранения) является более безопасной и чистой imo. – sigsegv

 Смежные вопросы

  • Нет связанных вопросов^_^