1

我在 Linux 上使用 iPhone 工具链,所以我没有 Interface Builder。那么如何在我的 ViewController 子类中布局我的视图呢?例如,我想要一个 UITextView 在屏幕中间?我应该在loadViewor中执行此操作吗viewDidLoad?我是否还必须将 ViewController 子类的视图设置为自身?

4

3 回答 3

2

使用代码布局所有视图并非易事。下面是一些代码:

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

框架是位置(第一个和第二个参数是 x 和 y 坐标)和大小(第三个和第四个参数是文本视图的宽度和高度)。

使用这种方式,您可以将任何视图添加到您的类中。有些视图是内置的,你不必自己绘制,有些则不是,你需要继承 UIView 并覆盖 drawRect。

当您的主视图控制器完成加载时,您应该在 viewDidLoad 中执行此操作

于 2010-09-25T13:48:28.513 回答
1

我编写了一个开源项目,正是这样做的:

https://github.com/charlesmchen/WeViews

这是另一个您可能会觉得有用的项目:

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

于 2012-02-25T06:09:36.303 回答
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 变量和方法,例如自动调整掩码。Apple 的 UIView 和 UIViewController 类引用充满了有用的信息。

于 2010-09-25T15:23:24.807 回答