在 iOS 中程式碼創建 UITableView 並設置 frame 後,發現表視圖佔滿整個螢幕而非指定尺寸,這是因為錯誤地將 tableView 直接賦值給 self.view。
- (void)viewDidLoad {
[super viewDidLoad];
UITableView *tableView = [[UITableView alloc]
initWithFrame:CGRectMake(0, 0, 20, 60)
style:UITableViewStylePlain];
self.view = tableView; // 錯誤!替換了整個視圖控制器的根視圖
}
UIViewController 的 view 屬性是根視圖,佔滿整個螢幕(扣除導航欄/標籤欄)。將 tableView 直接賦值給 self.view 會替換根視圖,導致 tableView 強制鋪滿螢幕,原本的 frame 設置失效。
- (void)viewDidLoad {
[super viewDidLoad];
UITableView *tableView = [[UITableView alloc]
initWithFrame:CGRectMake(0, 0, 200, 300)
style:UITableViewStylePlain];
tableView.dataSource = self;
tableView.delegate = self;
[self.view addSubview:tableView]; // 正確:添加到根視圖上
// 若需自動佈局適配
// tableView.translatesAutoresizingMaskIntoConstraints = NO;
// [NSLayoutConstraint activateConstraints:@[...]];
}
// .h
@interface MyTableViewController : UITableViewController
@end
// .m
- (void)viewDidLoad {
[super viewDidLoad];
// self.tableView 已自動創建並設置為根視圖
self.tableView.frame = CGRectMake(0, 0, 200, 300); // 此時 frame 有效
// 注意:UITableViewController 的 view 就是 tableView
}
| 屬性/方法 | 說明 |
|---|---|
| self.view | 視圖控制器的根視圖,佔滿螢幕 |
| addSubview: | 將視圖添加到視圖層級中 |
| initWithFrame: | 設置視圖在父視圖座標系中的位置與大小 |
| UITableViewController | 專用控制器,其 view 即為 tableView |
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
self.tableView.translatesAutoresizingMaskIntoConstraints = NO;
self.tableView.dataSource = self;
self.tableView.delegate = self;
[self.view addSubview:self.tableView];
// 使用約束精確控制位置大小
[NSLayoutConstraint activateConstraints:@[
[self.tableView.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:100],
[self.tableView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:20],
[self.tableView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-20],
[self.tableView.heightAnchor constraintEqualToConstant:300]
]];
}
safeAreaLayoutGuidedataSource/delegate 設置、numberOfRowsInSection 返回值