6

在 iOS7 中,分组表视图的单元格显示为表视图的全宽,更像是普通的表视图样式。但在模拟器的设置应用程序中,分组样式看起来不同。对实施这种类型的细胞有什么帮助吗?

4

3 回答 3

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 中,将 UITableViewCell 替换为 CustomTableViewCell。

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

...

}

在您的故事板文件中,将您的原型单元类设置为CustomTableViewCell,并将其标识符设置为“CustomTableViewCell”

IndentedGroupedTableViewCell

于 2013-10-02T05:05:13.653 回答
3

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

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

对于设置,不必让所有苹果的控件看起来都是标准的,您需要自己进行一些调整,也许为表格单元格设置背景。

小建议:暂时不要弄乱表格或单元格设计,并继续使用标准,直到人们习惯为止。

于 2013-09-13T10:39:58.307 回答
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
于 2013-11-19T03:40:02.870 回答