Программно макет iPhone UIView? - PullRequest
1 голос
/ 25 сентября 2010

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

Ответы [ 3 ]

2 голосов
/ 25 сентября 2010

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

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

Фрейм - это место (первый и второй аргумент - координаты x и y) и размер (третий и четвертый аргумент - ширина и высота текстового представления).

Используя этот способ, вы можете добавить любое представление в ваш класс. Часть представления встроена, и вам не нужно рисовать себя, а некоторые нет, и вам нужно создать подкласс UIView и переопределить drawRect.

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

1 голос
/ 25 февраля 2012

Я написал проект с открытым исходным кодом, который делает именно это:

https://github.com/charlesmchen/WeViews

Вот еще один проект, который вам может пригодиться:

http://code.google.com/p/layoutmanagers/

0 голосов
/ 25 сентября 2010

Я обычно строю всю иерархию представления в методе loadView и выполняю дополнительную настройку в viewDidLoad, например, чтобы настроить содержимое подпредставлений для отображения данных, связанных с контроллером представления.Важно установить выход контроллера view в методе 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, например, наавторазмерная маска.Ссылки на классы Apple UIView и UIViewController полны полезной информации.

...