以编程方式更改表的大小
Posted
技术标签:
【中文标题】以编程方式更改表的大小【英文标题】:Programmatically change Size of Table 【发布时间】:2014-07-17 14:30:04 【问题描述】:故事板:http://s7.directupload.net/images/140717/z5hwmezv.png
大家好, 我有一个应用程序会递归地触发相同的 tableview 控制器(假设其中有文件和文件夹),直到您触发文件而不是文件夹。单击文件时,它会跳转到 GLKit 视图控制器。
现在我想以编程方式调整 tableView 的大小,但这是行不通的。我已经得到了窗口大小,我将用它来计算 tableView 的位置和大小:
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;
我尝试了不同的方法来改变大小,如下所示,这不会改变任何东西。
mainTableView.frame = CGRectMake(0, 0, screenWidth, screenHeight);
如果我以编程方式创建 mainTableView,但随后我的 segue 被删除,我没有找到任何以编程方式创建 segue 的解决方案。
如果您能帮我找到一个适用于情节提要 tableView 的解决方案,那就太好了。
【问题讨论】:
如果您的故事板使用自动布局,那么您需要影响约束而不是框架。 这是一个 UITableViewController 还是只是 UIViewController 中的一个 UITableView? mainTableView 是 UIViewController 内的 UITableView:@interface CustomersList : UIViewController IBOutlet UITableView *mainTableView; 自动布局被选中。 在情节提要中使用 Autoresize Subviews 或 Clip Subviews。 【参考方案1】:第一步:添加委托 UITableViewDataSource,UITableViewDelegate
@interface viewController: UIViewController<UITableViewDataSource,UITableViewDelegate>
UITableView *tableView;
第 2 步:
-(void)viewDidLoad
tableView=[[UITableView alloc]init];
tableView.frame = CGRectMake(10,30,320,400);
tableView.dataSource=self;
tableView.delegate=self;
tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
[tableView reloadData];
[self.view addSubview:tableView];
第 3 步:tableview 的属性
//-- For table sections
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 1;
//-- For no of rows in table
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 10;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
//-- Table header height if needed
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
return 50;
//-- Assign data to cells
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath] ;
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.textLabel.text=[your_array objectAtIndex:indexPath.row]; ***(or)*** cell.textLabel.text = @"Hello";
return cell;
//-- Operation when touch cells
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
// Your custom operation
【讨论】:
这个答案如何尝试回答 OP 的问题? 请以编程方式添加表格视图。所以我提到了方式。 嗨,Nazim,感谢您的回答。我以编程方式创建了 tableView。但是现在我遇到了问题,我的两个 segues 也被删除了。我不知道如何在情节提要中没有表格的情况下创建转场:/ 我取消了表格的删除,并在情节提要控制器中将其缩小到 0 高度。它现在在以编程方式创建的表后面,所有的 segues 都工作正常。不是完美的解决方案,但我猜它有效?【参考方案2】:看你的照片让我觉得你的 CustomerListVC 是一个 UITableView 子类,这意味着 tableview 是根视图,如果你使用基于 UINavigationController 的流程,那么你不能轻易调整根视图的大小。
你可以做的是将 UITableView 放在一个容器中,并从控制器中操作它的约束。
第一次改变
class CustomerListVC : UITableViewController
到
class CustomerListVC : UIViewController
接下来丢弃 Interface Builder
中的 Customer List 实例并拖入一个新的 UIViewController
实例。 Xcode 不希望您更改其库存对象的基类。
将新的UIViewController
实例设为CustomerListVC
类型FileOwner
并将UITableView
拖到内容视图中。
设置边缘约束并将出口添加到视图控制器中的约束。
从那里玩你认为合适的桌子。例如
-(void)squishAtBottomLeftAnimated:(BOOL)animate
CGFloat animateTime = animate? 0.5:0;
[UIView animateWithDuration:animateTime animations:^
self.topEdgeConstraint.constant = 400;
self.bottomEdgeConstraint.constant = 5;
self.leadingEdgeConstraint.constant = 5;
self.trailingEdgeConstraint.constant = 200;
[self.view layoutIfNeeded];
];
【讨论】:
感谢您的回答。我选择了 Nazim 的解决方案,因为它需要的修改较少:)以上是关于以编程方式更改表的大小的主要内容,如果未能解决你的问题,请参考以下文章