设置自定义 UITableView tableHeaderView
Setting a custom UITableView tableHeaderView
我正在处理一个项目,我正在尝试将 table 视图 header 设置为复杂视图。该项目不使用自动布局,所有约束均以编程方式处理。我有一个包含 table 视图的 Parent 视图控制器。
这是 parent 视图控制器的代码(委托和数据源在 parent 中)
@property (nonatomic, strong) NSMutableArray *array;
- (void)viewDidLoad
{
[super viewDidLoad];
self.array = [NSMutableArray new];
[self.array addObject:@"One"];
[self.array addObject:@"Two"];
[self.array addObject:@"Three"];
[self.array addObject:@"Four"];
[self.view addSubview:self.detailedTableView];
}
- (void)updateViewConstraints
{
[super updateViewConstraints];
NSDictionary *views = @{
@"detailedTable": self.detailedTableView,
};
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[detailedTable]-0-|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[detailedTable]-0-|" options:0 metrics:nil views:views]];
constant:0.f]];
}
-(UITableView *)detailedTableView
{
if(!_detailedTableView)
{
_detailedTableView = [UITableView new];
_detailedTableView.dataSource = self;
_detailedTableView.delegate = self;
_detailedTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_detailedTableView.showsVerticalScrollIndicator = NO;
_detailedTableView.separatorInset = UIEdgeInsetsZero;
_detailedTableView.translatesAutoresizingMaskIntoConstraints = NO;
}
return _detailedTableView;
}
在继承自 parent 的 child 视图控制器中,我尝试将 header 视图设置为 [=29= 中包含的自定义视图] 视图控制器。这是相关代码:
@interface ChildViewController ()
@property (nonatomic, strong) UIView *testView;
@end
@implementation ChildViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.detailedTableView.tableHeaderView = self.testView;
}
-(UIView *)testView
{
if(!_testView)
{
_testView = [UIView new];
_testView.backgroundColor = [UIColor orangeColor];
_testView.translatesAutoresizingMaskIntoConstraints = NO;
}
return _testView;
}
- (void)updateViewConstraints
{
[super updateViewConstraints];
NSDictionary *views = @{
@"test" : self.testView
};
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[test(width)]-0-|" options:0 metrics:metrics views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[test(100)]" options:0 metrics:metrics views:views]];
}
我不是通过框架 属性 设置宽度或高度,而是通过约束。但是,此代码在 iOS 8.1 上生成下图,并在 iOS 7.1
上完全崩溃
我可以看到正在添加虚拟视图,但它不在适当的位置作为 tableHeaderView,因为它覆盖了 UITable 中的其他数组项。另外,这在 iOS 7.1 上不起作用,因为它会抛出此错误消息:
*** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794
2015-01-03 22:33:05.540 Saloote A[10073:607] This is where we save the application data during a exception
2015-01-03 22:33:05.541 Saloote A[10073:607] Exception: Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.
发生这种情况是因为您的测试视图不是直接 vc.view 的子视图。
您只能为您的子视图添加约束。
您可以使用 setFrame 代替 autoLayout。
我正在处理一个项目,我正在尝试将 table 视图 header 设置为复杂视图。该项目不使用自动布局,所有约束均以编程方式处理。我有一个包含 table 视图的 Parent 视图控制器。
这是 parent 视图控制器的代码(委托和数据源在 parent 中)
@property (nonatomic, strong) NSMutableArray *array;
- (void)viewDidLoad
{
[super viewDidLoad];
self.array = [NSMutableArray new];
[self.array addObject:@"One"];
[self.array addObject:@"Two"];
[self.array addObject:@"Three"];
[self.array addObject:@"Four"];
[self.view addSubview:self.detailedTableView];
}
- (void)updateViewConstraints
{
[super updateViewConstraints];
NSDictionary *views = @{
@"detailedTable": self.detailedTableView,
};
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[detailedTable]-0-|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[detailedTable]-0-|" options:0 metrics:nil views:views]];
constant:0.f]];
}
-(UITableView *)detailedTableView
{
if(!_detailedTableView)
{
_detailedTableView = [UITableView new];
_detailedTableView.dataSource = self;
_detailedTableView.delegate = self;
_detailedTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_detailedTableView.showsVerticalScrollIndicator = NO;
_detailedTableView.separatorInset = UIEdgeInsetsZero;
_detailedTableView.translatesAutoresizingMaskIntoConstraints = NO;
}
return _detailedTableView;
}
在继承自 parent 的 child 视图控制器中,我尝试将 header 视图设置为 [=29= 中包含的自定义视图] 视图控制器。这是相关代码:
@interface ChildViewController ()
@property (nonatomic, strong) UIView *testView;
@end
@implementation ChildViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.detailedTableView.tableHeaderView = self.testView;
}
-(UIView *)testView
{
if(!_testView)
{
_testView = [UIView new];
_testView.backgroundColor = [UIColor orangeColor];
_testView.translatesAutoresizingMaskIntoConstraints = NO;
}
return _testView;
}
- (void)updateViewConstraints
{
[super updateViewConstraints];
NSDictionary *views = @{
@"test" : self.testView
};
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[test(width)]-0-|" options:0 metrics:metrics views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[test(100)]" options:0 metrics:metrics views:views]];
}
我不是通过框架 属性 设置宽度或高度,而是通过约束。但是,此代码在 iOS 8.1 上生成下图,并在 iOS 7.1
上完全崩溃我可以看到正在添加虚拟视图,但它不在适当的位置作为 tableHeaderView,因为它覆盖了 UITable 中的其他数组项。另外,这在 iOS 7.1 上不起作用,因为它会抛出此错误消息:
*** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794
2015-01-03 22:33:05.540 Saloote A[10073:607] This is where we save the application data during a exception
2015-01-03 22:33:05.541 Saloote A[10073:607] Exception: Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.
发生这种情况是因为您的测试视图不是直接 vc.view 的子视图。
您只能为您的子视图添加约束。
您可以使用 setFrame 代替 autoLayout。