以编程方式将 UIButton 添加到 UITableView 错误点

Posted

技术标签:

【中文标题】以编程方式将 UIButton 添加到 UITableView 错误点【英文标题】:Adding UIButton To UITableView Programmatically Wrong Spot 【发布时间】:2016-09-30 22:32:34 【问题描述】:

我正在尝试将 UIButton 添加到 TableView,它位于表格视图的右下角,距离右边缘 20,距离底部 20。但是,它最终将按钮粘贴在左上角。我做错了什么?

UIButton *goToTop = [UIButton buttonWithType:UIButtonTypeCustom];
    [goToTop setImage:redGo forState:UIControlStateNormal];
    [goToTop addTarget:self action:@selector(beginCampaign) forControlEvents:UIControlEventTouchUpInside];
    [goToTop setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [goToTop.layer setBorderColor:[[UIColor redColor] CGColor]];
    [self.tableView addSubview:goToTop];

    goToTop.translatesAutoresizingMaskIntoConstraints = NO;
    /* Leading space to superview */
    NSLayoutConstraint *leftButtonXConstraint = [NSLayoutConstraint
                                                 constraintWithItem:goToTop attribute:NSLayoutAttributeRight
                                                 relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:
                                                 NSLayoutAttributeLeft multiplier:1.0 constant:20];
    /* Top space to superview Y*/
    NSLayoutConstraint *leftButtonYConstraint = [NSLayoutConstraint
                                                 constraintWithItem:goToTop attribute:NSLayoutAttributeBottom
                                                 relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:
                                                 NSLayoutAttributeTop multiplier:1.0f constant:20];
    /* Fixed width */
    NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:goToTop
                                                                       attribute:NSLayoutAttributeWidth
                                                                       relatedBy:NSLayoutRelationEqual
                                                                          toItem:nil
                                                                       attribute:NSLayoutAttributeNotAnAttribute
                                                                      multiplier:1.0
                                                                        constant:60];
    /* Fixed Height */
    NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:goToTop
                                                                        attribute:NSLayoutAttributeHeight
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:nil
                                                                        attribute:NSLayoutAttributeNotAnAttribute
                                                                       multiplier:1.0
                                                                         constant:60];
    /* 4. Add the constraints to button's superview*/
    [self.tableView addConstraints:@[leftButtonXConstraint, leftButtonYConstraint, widthConstraint, heightConstraint]];

这是我想要的:

它是这样显示的:

【问题讨论】:

你想要按钮在tableview里面还是tableview外面?您使用的是视图控制器还是 tableviewcontroller?您应该使用前导和尾随而不是左/右属性 @Paulw11 我想要 TableView 中的按钮,tableview 在 navigationController 中 那么你应该使用leading=leading和bottom=bottom,而不是left=right和top=bottom。您的视图控制器可能在导航控制器中,但它是直接 UIViewController 子类还是 UITableViewController 子类? IE。什么是根视图? uiview 还是 tableview? @Paulw11 应用程序的完整层次结构是这样的。根视图是一个 tabBarController,有问题的视图以 NavigationController 开头,其中有一个 ViewController 从它自己的 nib 加载,它是一个 TableViewController。 我刚刚测试了这个。您不能将子视图添加到 UITableView。您将需要使用视图控制器并将 tableview 添加到其中,然后您可以将按钮添加到根视图并设置其相对于 tableview 的约束 【参考方案1】:

您已将约束设置在表格视图的左上角而不是右下角。 改变这个:

/* Leading space to superview */
NSLayoutConstraint *leftButtonXConstraint = [NSLayoutConstraint
                                             constraintWithItem:goToTop attribute:NSLayoutAttributeRight
                                             relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:
                                             NSLayoutAttributeLeft multiplier:1.0 constant:20];
/* Top space to superview Y*/
NSLayoutConstraint *leftButtonYConstraint = [NSLayoutConstraint
                                             constraintWithItem:goToTop attribute:NSLayoutAttributeBottom
                                             relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:
                                             NSLayoutAttributeTop multiplier:1.0f constant:20];

到这里:

/* Leading space to superview */
NSLayoutConstraint *leftButtonXConstraint = [NSLayoutConstraint
                                             constraintWithItem:goToTop attribute:NSLayoutAttributeRight
                                             relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:
                                             NSLayoutAttributeRight multiplier:1.0 constant:20];
/* Top space to superview Y*/
NSLayoutConstraint *leftButtonYConstraint = [NSLayoutConstraint
                                             constraintWithItem:goToTop attribute:NSLayoutAttributeBottom
                                             relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:
                                             NSLayoutAttributeBottom multiplier:1.0f constant:20];

【讨论】:

以上是关于以编程方式将 UIButton 添加到 UITableView 错误点的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 UIButton 添加到 rootview,我做错了啥?

以编程方式将 UIButton 添加到 UITableView 但按钮不显示

如何以编程方式将 UIButton 添加到 UIToolBar?

以编程方式将 UIButton 添加到带有情节提要的自定义 ViewController

以编程方式将 UIButton 添加到 UINavigationBar 的子视图,并且触摸事件未注册

Swift:以编程方式在键盘上方添加 UIButton