Използвам веригата инструменти на iPhone на Linux и затова нямам Interface Builder. И така, как мога да оформя изгледа си в моя подклас ViewController? Например, искам UITextView в средата на екрана? Трябва ли да направя това в loadView
или viewDidLoad
. Трябва ли също така да задам изгледа за подкласа ViewController на себе си?
Програмно оформление iPhone UIView?
Отговори (3)
Не е лесна работа да оформите целия изглед с помощта на код. Ето малко код:
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake (100, 100, 100, 100)];
[self.view addSubview:textView];
Рамката е мястото (първият и вторият аргумент са координатите x и y) и размерът (третият и четвъртият аргумент са ширината и височината на текстовия изглед).
Използвайки този начин, можете да добавите всеки изглед към вашия клас. Някои от изгледите са вградени и не е нужно да рисувате сами, някои от тях не са и трябва да подкласирате UIView и да замените drawRect.
Трябва да направите това във viewDidLoad, когато основният ви контролер за изглед приключи със зареждането
Написах проект с отворен код, който прави точно това:
https://github.com/charlesmchen/WeViews
Ето още един проект, който може да ви бъде полезен:
http://code.google.com/p/layoutmanagers/
Обикновено изграждам цялата йерархия на изгледа в метода 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, например маската за автоматично преоразмеряване. Препратките към класове UIView и UIViewController на Apple са пълни с полезна информация.