我正在为iPad应用创建一个表格视图控制器。此视图可能会全屏显示或在模态视图中显示,因此每次显示时大小可能不同。理想情况下,我希望使我的代码足够通用,无论其显示的大小如何。 (作为一项学术练习,我也喜欢在iPhone上运行的代码 - 但这不是真正的要求。)
我正在使用分组的表格视图样式。我想在单元格视图中嵌入一个UITextField。我可以将文本字段放入单元格中(使用cell.AddSubview),但是当我使用分组样式时,文本字段位于表格的最左侧 - 而不是它应该位于白色区域中。
我环顾四周(例如在UICatalog示例和此处的答案中),这个问题的所有解决方案似乎都涉及对边界区域的常数x偏移进行硬编码。这个x偏移在iPad上约为35像素,但在iPhone上约为20像素。
在我看来应该有更好的方法来做到这一点,但我还没有找到它。我已经尝试过查看矩形cell.Bounds,cell.Frame,cell.ContentView.Bounds和cell.ContentView.Frame - 它们都没有分组单元格的“实际”内容区域。
有没有人有其他建议,或者我是否需要对该值进行硬编码?
由于
答案 0 :(得分:6)
将UIViews
添加到cell.contentView
并为此视图设置autoResizeMask
属性
以下是使用cell
和UILabel
创建UITextField
的示例:
// custom cell implementation
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ( (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) )
{
self.label = [[[UILabel alloc] init] autorelease];
self.label.font = [UIFont fontWithName:@"Helvetica-Bold" size:17];
self.label.backgroundColor = [UIColor clearColor];
[self.contentView addSubview:self.label];
self.textField = [[[UITextField alloc] init] autorelease];
//this will make our textField resized properly
self.textField.autoresizingMask = UIViewAutoresizingFlexibleWidth;
self.textField.borderStyle = UITextBorderStyleNone;
self.textField.backgroundColor = [UIColor clearColor];
self.textField.textColor = [UIColor darkGrayColor]; //text color
self.textField.font = [UIFont systemFontOfSize:17.0]; //font size
self.textField.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
self.textField.keyboardType = UIKeyboardTypeDefault; // type of the keyboard
self.textField.returnKeyType = UIReturnKeyNext; // type of the return key
self.textField.clearButtonMode = UITextFieldViewModeWhileEditing; // has a clear 'x' button to the right
[self.contentView addSubview:self.textField];
self.selectionStyle = UITableViewCellSelectionStyleNone;
self.accessoryType = UITableViewCellAccessoryNone;
}
return self;
}
和dataSource方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
类似的东西
CustomCell* c = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
if (c == nil)
{
c = [[[CellWithPass alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier1] autorelease];
c.textField.delegate = self;
}
//in this method cell and cell subviews are not resized, so
//we are setting subviews frames here for cell with frame {{0,0},{320,44}}
c.label.text = @"label";
float w = [c.label.text sizeWithFont:c.label.font].width;
c.label.frame = CGRectMake(10, 0, w, 44);
c.textField.frame = CGRectMake(w + 10, 12, c.contentView.frame.size.width - w - 20, 20);
return c;
答案 1 :(得分:1)
我也一直在寻找类似的答案。
我还没有找到任何一种“好”的答案,但是这个对话确实解释了为什么对contentView框架的调用不会返回实际框架减去附件的专用区域和圆边填充:
UITableViewCell's contentView's width with a given accessory type
我已经采纳了巴雷特的建议,只是用硬编码值相应地调整了框架,但是如果你找到更好的答案会非常感兴趣。