首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS UITableView 佔滿整個螢幕的原因與解決方法

     編輯:程式設計綜合問答

在 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:@[...]];
}

方案二:繼承 UITableViewController(純表視圖頁面)

// .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]
    ]];
}

常見衍生問題

  • frame 為 CGRectZero 但顯示正常:因約束或 autoresizingMask 決定最終 frame
  • 在 navigationController 中高度異常:需考慮 navigationBar、tabBar 遮擋,使用 safeAreaLayoutGuide
  • cell 不顯示:檢查 dataSource/delegate 設置、numberOfRowsInSection 返回值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved