gpt4 book ai didi

ios - 使用自动布局将 View 定位在 TableView 之上

转载 作者:行者123 更新时间:2023-11-29 10:38:43 28 4
gpt4 key购买 nike

我的 Storyboard 中有一个 TableView ,它的类设置为我的 UITableView 子类,该子类名为 SPSExplanationTableView。在 Interface Builder 中没有对此 TableView 设置约束。

我正在尝试以编程方式创建一个显示在表格 View 前面的 UIViewwhich I know how to do (博客文章链接)——但它是使用自动布局调整大小和定位的。这是我的代码:

#import "SPSExplanationTableView.h"

@interface SPSExplanationTableView()

@property (nonatomic, strong) UIView *explanationView;

@end

@implementation SPSExplanationTableView

- (void)awakeFromNib
{
[super awakeFromNib];
self.explanationView = [[UIView alloc] init];
self.explanationView.translatesAutoresizingMaskIntoConstraints = NO;
self.explanationView.backgroundColor = [UIColor blueColor];

[self addSubview:self.explanationView];
[self bringSubviewToFront:self.explanationView];

NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:self.explanationView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f constant:150.0f];
[self.explanationView addConstraint:heightConstraint];

NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.explanationView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f constant:200.0f];
[self.explanationView addConstraint:widthConstraint];

NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.explanationView
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterY
multiplier:1.0f constant:0.0f];
[self addConstraint:topConstraint];

NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:self.explanationView
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1.0f constant:0.0f];
[self addConstraint:leftConstraint];

@end

当我运行该应用程序时,它因以下断言失败而崩溃:

*** Assertion failure in -[SPSExplanationTableView layoutSublayersOfLayer:],/SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout stillrequired after executing -layoutSubviews. SPSExplanationTableView'simplementation of -layoutSubviews needs to call super.'

Taking the message literally and overriding layoutSubviews has no effect i.e. I still get the same crash.

- (void)layoutSubviews
{
[super layoutSubviews];
}

实现我想要实现的目标的正确方法是什么?


对于 Aubada Taljo,这是 Interface Builder 中的 TableView :

enter image description here


更新: 我最终通过不使用自动布局解决了这个问题!我覆盖了我的 SPSExplanationTableView 类中的 layoutSubviews 方法,并将 explanationView 的 center 属性设置为自身边界的中心,并对 y 轴位置进行了一些微调,使其看起来像我想要的那样。

最佳答案

这会导致崩溃,因为 UITableView 并非设计用于执行此操作。 UITableView 只关心它的单元格、标题,也许还有它的背景,并且它有不使用自动布局的逻辑。因此,如果您尝试将其包含在它与任何 subview 之间的任何约束计算中,它将崩溃,例如如果您在单元格和表格之间添加约束,这也会崩溃。

我建议你做的是添加一个 super View ,它将包含你的表和你想要覆盖的 View :

SuperviewWithConstraints
|
|-- YourTableViewWithConstraintsRelativeToSuperview
|
|-- YourOverlayWithConstraintsRelativeToSuperview

并在那里设置约束。然后将该 super View 作为您的 View Controller 的 View 。不过,您将不得不放弃使用 UITableViewController 作为控制类。

关于ios - 使用自动布局将 View 定位在 TableView 之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25611794/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com