通过添加contentInset属性来在iPad上将UITableView居中显示?

3
我想通过添加左/右边距来在iPad上重用iPhone的UITableView,从而使其居中。我尝试使用.contentInset属性,但似乎没有影响右边距。我错过了什么吗?(我尝试了一个负的右插入,但也不起作用。) 这里是一个包含测试代码的Gist,您可以将其放入UITableViewController子类中。)
// In a UITableViewController subclass
- (void)viewDidLoad {
    [super viewDidLoad];

    // the space I want on either side of the table
    CGFloat xMargin = 100.0f;

    // increase content inset and decrease content size an equal amount
    UIEdgeInsets contentInset = self.tableView.contentInset;
    contentInset.left = xMargin;
    contentInset.right = xMargin;
    CGSize contentSize = self.tableView.contentSize;
    contentSize.width = contentSize.width -= xMargin * 2;

    self.tableView.contentSize = contentSize;
    self.tableView.contentInset = contentInset;

    // Turning autolayout off doesn't appear to help
    //self.tableView.translatesAutoresizingMaskIntoConstraints = NO;
}

我不能仅仅缩短表格的宽度,否则右边距将没有正确的颜色或无法根据用户触摸滚动表格。

Tables


1
嗯,对于这种情况,我会尝试的第一件事是不使用UITableViewController,而是使用普通的UIViewController,并将UITableView添加为其子视图。您应该可以轻松设置其框架以满足您的需求,而不会出现背景问题。 - rymagno
@user2608440 我试过了。(我使用UITableViewController使示例代码更简单。)虽然我可以轻松设置tableview的框架,但这并不能解决我的问题 - 两侧的区域不会成为tableView的一部分,因此无法滚动,正如我所期望的截图所示。 - zekel
1
抱歉造成误解。创建一个自定义的UITableViewCell来实现这个外观怎么样?它仍然可以跨越整个屏幕宽度,但每个单元格都会有一个白色子视图居中,并且“边距”可以是透明的或相同的灰色。 - rymagno
可能会起作用。但我真的希望避免使用自定义的UITableViewCell子类。(我想在整个应用程序中使用此布局,并且更喜欢使用原始的UITableViewCell。)还有其他想法吗? - zekel
我能想到的另一种方法是在整个视图上使用手势识别器来映射到tableView。但是,这种方法似乎更加复杂,无法在所有其他视图中重用。为了重用,我个人会使用普通的UIViewControllers并子类化一个使用自定义单元格的UITableView。这样,您每个VC上唯一需要做的事情就是将自定义UITableView添加为子视图并更改数据源。 - rymagno
2个回答

0
一个简单的方法是像这样子类化UITableViewCell

.h文件:

@interface AGBTableViewCell : UITableViewCell

@property (nonatomic, assign) CGFloat minimumWidth;

@end

.m文件:

@implementation AGBTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.minimumWidth = 320;
    }
    return self;
}

- (void) setFrame:(CGRect)frame {
    CGRect newFrame = frame;

    if (CGRectGetWidth(newFrame) > self.minimumWidth) {
        CGFloat margin = (CGRectGetWidth(newFrame) - self.minimumWidth) / 2;
        newFrame.origin.x = margin;
        newFrame.size.width = self.minimumWidth;
    }

    [super setFrame:newFrame];
}

@end

单元格将被插入,但您仍然可以在侧面滚动:

enter image description here

这里有一个示例项目

这种方法需要额外的工作来处理表格动画,例如删除行。


我已经尝试了你的方法,但正如你所说,行动画效果并不是很好,有什么建议吗? - Pratik Jamariya

0

如果您只关心居中,可以使用以下方法将视图居中于其父视图内:

childView.center = [parent convertPoint:parent.center fromView:parent.superview];

contentInset 不会改变视图的大小,它只是在内容周围添加滚动区域。


在这种情况下,编辑tableView的“frame”属性以更改其大小,并使用上面的代码行将其居中。 - KerrM
那么,你是否看过contentSize属性呢? - KerrM
我认为我应该能够减少contentSize.width并增加相同数量的contentInset.left/right来获得我想要的效果...但似乎不行。 - zekel
你为这个视图控制器设置了自动布局吗? - KerrM
让我们在聊天中继续这个讨论 - zekel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接