Програмно оформление iPhone UIView?

Използвам веригата инструменти на iPhone на Linux и затова нямам Interface Builder. И така, как мога да оформя изгледа си в моя подклас ViewController? Например, искам UITextView в средата на екрана? Трябва ли да направя това в loadView или viewDidLoad. Трябва ли също така да задам изгледа за подкласа ViewController на себе си?


person Mohit Deshpande    schedule 25.09.2010    source източник
comment
Помислете, че много обекти имат свойство център. това е CGPoint и е много полезно, когато искате да центрирате обект в пространството. По-добре е, отколкото да използвате свойството рамка, където трябва да изчислявате нещата.   -  person Vinzius    schedule 26.09.2010


Отговори (3)


Не е лесна работа да оформите целия изглед с помощта на код. Ето малко код:

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

Рамката е мястото (първият и вторият аргумент са координатите x и y) и размерът (третият и четвъртият аргумент са ширината и височината на текстовия изглед).

Използвайки този начин, можете да добавите всеки изглед към вашия клас. Някои от изгледите са вградени и не е нужно да рисувате сами, някои от тях не са и трябва да подкласирате UIView и да замените drawRect.

Трябва да направите това във viewDidLoad, когато основният ви контролер за изглед приключи със зареждането

person vodkhang    schedule 25.09.2010

Написах проект с отворен код, който прави точно това:

https://github.com/charlesmchen/WeViews

Ето още един проект, който може да ви бъде полезен:

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

person Matthew Chen    schedule 25.02.2012

Обикновено изграждам цялата йерархия на изгледа в метода 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 са пълни с полезна информация.

person sigsegv    schedule 25.09.2010
comment
Не използвам инструмент за създаване на интерфейси, така че първият ред от вашия примерен код изобщо ще бъде ли необходим? Знам, че мога да пропусна IBOutlet. Мога ли също да пропусна декларацията за свойства и следователно декларацията за синтез? - person Mohit Deshpande; 10.10.2010
comment
Зависи. Всеки елемент, който добавите като наследник на изхода на изгледа, се запазва и освобождава с него, така че не е необходимо. Въпреки това, ако имам нужда от достъп до подизглед навсякъде в контролера, бих предпочел да го имам като удобна променлива на екземпляр и да го задам на нула във viewDidUnload и да го освободя в dealloc, като етикета в горния пример. По този начин не завършвам с указател към освободен обект. Можете също така просто да го присвоите ръчно или да използвате (присвояване) свойство, или да му присвоите етикет и да го възстановите, когато е необходимо, но задаването му като (запазено) свойство е по-безопасно и по-чисто imo. - person sigsegv; 11.10.2010