iOS7-UItableViewCell显示在带有样式分组的表视图中

时间:2013-09-13 09:51:10

标签: ios7

在iOS7中,分组表视图的单元格显示为表格视图的整个宽度,更像是普通的表格视图样式。但是在模拟器的设置应用程序中,分组的样式看起来不同。可以帮助实现这种类型的单元格吗?

3 个答案:

答案 0 :(得分:14)

此解决方案适用于iOS7以及之前版本的iOS。

创建自定义UITableView单元类并覆盖UITableViewCell。在setFrame中,您可以调整所需的单元格大小。 setFrame和setAlpha都在tableView之后调用:willDisplayCell:forRowAtIndexPath:所以任何附件视图和图像视图都能正确显示。

参考:https://developer.apple.com/library/ios/documentation/uikit/reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath

@interface CustomTableViewCell : UITableViewCell

@end

@implementation CustomTableViewCell

-(void) setFrame:(CGRect)frame
{
  float inset = 20.0f;
  frame.origin.x += inset;
  frame.size.width -= 2 * inset;
  [super setFrame:frame];
}
@end

在cellForRowAtIndexPath中,用CustomTableViewCell替换UITableViewCell。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:@"CustomTableViewCell" forIndexPath:indexPath];

...

}

在您的故事板文件中,将Prototype单元类设置为 CustomTableViewCell ,它是“CustomTableViewCell”的标识符

IndentedGroupedTableViewCell

答案 1 :(得分:3)

这个'全宽'是iOS7的默认值,来自Apple的Transition guid:

  

每组扩展屏幕的整个宽度。

对于设置,没有必要所有苹果'控件看起来很标准,你需要自己做一些调整,也许把表格单元格放在背景中。

小建议:暂时不要弄乱桌子和电池设计,并继续使用标准,直到人们习惯它为止。

答案 2 :(得分:0)

您可以使用自定义表格单元格类并覆盖setFrame:从表格视图的边缘拉取表格视图单元格。下面的示例代码。

这个答案是基于Aumansoftware的答案(谢谢!我会将此作为评论添加,但不足以代表)。该答案的问题在于它依赖于从头开始设置框架的调用代码,而不是进行相对更改。这通常是正确的,但如果调用者反复修改现有帧则不会。这具有在每次呼叫时水平缩小帧的副作用。事实证明,这正是在桌面行上使用拖放时会发生的事情!所以这个版本只是从父视图中拉出边缘。

@interface MyTableViewCell : UITableViewCell
/**
 * Pixel inset off left and right sides.
 */
@property (nonatomic, assign) CGFloat sideInset;
@end

@implementation MyTableViewCell

- (void) setFrame:(CGRect)frame {
    if (self.superview) {
            CGFloat parentWidth = self.superview.frame.size.width;
            if (frame.size.width > (parentWidth - 2.0 * self.sideInset)) {
                    frame.origin.x = self.sideInset;
                    frame.size.width = parentWidth - (2.0f * self.sideInset);
            }
    } else {
            frame.origin.x = self.sideInset;
            frame.size.width = frame.size.width - (2.0f * self.sideInset);
    }
    [super setFrame:frame];
}

@end