【问题标题】:How can I align 3 UIButtons to the center of an UITableCellView?如何将 3 个 UIButtons 对齐到 UITableCellView 的中心?
【发布时间】:2016-01-06 03:01:53
【问题描述】:

如何将 3 个 UIButtons 与 UITableCellView 的中心对齐?

例如说我有 3 个UIButtons 的标题:

  1. 电子邮件
  2. 电话
  3. Skype

UIButtons 中的一个或多个可能被隐藏。例如,如果电话 UIButton 被隐藏,则只有电子邮件和 Skype 应居中对齐。如果电话和 Skype 被隐藏,那么只有电子邮件应该居中对齐。

当任何UIButtons 被隐藏时,可见的应该居中对齐。

我想将它们水平和垂直居中。

【问题讨论】:

  • 您想将它们垂直和水平对齐,还是仅垂直对齐并横向放置?
  • 我会将单元格子类化并在 layoutSubviews 中设置按钮的框架:
  • iOS 9 引入了专为这种情况设计的UIStackView
  • @deanware:这正是它的用途,+1
  • 另外,this tutorial 可以提供帮助

标签: ios swift uitableview uibutton autolayout


【解决方案1】:

针对 xcode 7 测试:

我想你正在寻找类似的东西

解决方案:

步骤: 1) 所需要的是一个封装视图,它将所有三个按钮(Skype、电话、电子邮件)保持在中心,无论其中是否有一个按钮、两个或三个按钮。为此创建了一个持有人视图,在下面的快照中以绿色背景显示。

该持有人视图的约束是

它只是保存所有的子视图,它会从它的内容中获取它的大小,所以不需要给它高度/宽度限制。

2) 现在对中心按钮的约束将是

3) 两侧按钮的约束将是

如果您需要隐藏任何按钮,只需将其宽度约束设为 0,所有其他按钮都会相应地重新排列

对于 TableView 单元格:

    @IBOutlet weak var emailButtonWidthConstraint : NSLayoutConstraint?
    @IBOutlet weak var phoneButtonWidthConstraint : NSLayoutConstraint?
    @IBOutlet weak var skypeButtonWidthConstraint : NSLayoutConstraint?

    func showButtons(showSkype showSkype : Bool, showEmail : Bool, showPhone : Bool ){
        emailButtonWidthConstraint?.constant = showEmail ? 54.0 : 0.0
        phoneButtonWidthConstraint?.constant = showPhone ? 54.0 : 0.0
        skypeButtonWidthConstraint?.constant = showSkype ? 54.0 : 0.0

        self.layoutIfNeeded()
    }

用途:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as? CustomCell

        if indexPath.row == 0 {
            cell?.showButtons(showSkype: true, showEmail: true, showPhone: true)
        } else if indexPath.row == 1 {
            cell?.showButtons(showSkype: false, showEmail: true, showPhone: true)
        } else if indexPath.row == 2 {
            cell?.showButtons(showSkype: true, showEmail: false, showPhone: true)
        } else if indexPath.row == 3 {
            cell?.showButtons(showSkype: true, showEmail: true, showPhone: false)
        } else if indexPath.row == 4 {
            cell?.showButtons(showSkype: false, showEmail: false, showPhone: true)
        } else if indexPath.row == 5 {
            cell?.showButtons(showSkype: false, showEmail: true, showPhone: false)
        } else if indexPath.row == 6 {
            cell?.showButtons(showSkype: true, showEmail: false, showPhone: false)
        } else {
            cell?.showButtons(showSkype: true, showEmail: true, showPhone: true)
        }

        return cell!
    }

使用 UIStackView 也可以实现同样的效果(显然没有所有这些令人头疼的问题),但它不会在 9.0 之前的 iOS 上运行

更新(2015 年 10 月 26 日):

GitHub Repo 用于测试项目

【讨论】:

  • 你能发布相同的objective-c版本吗?
  • objective-c 的实现完全一样(你只需要改变语法)
  • 我在实施约束时遇到了麻烦。我是自动布局的新手。我还需要在每个按钮之间进行一些填充。你能指导正确的方法吗?
  • @Usama 没有tableview这可能吗?我想要 7 个按钮居中对齐。你能帮忙吗?
【解决方案2】:

您应该查看 UIStackView(不过,它适用于 iOS 9 及更高版本)。

我相信 UIStackViews 有一种方法可以让嵌入式 UIViews “消失”,并且它会重新对齐嵌入在同一 UIStackView 中的其他 UIViews。

【讨论】:

  • 谢谢,但我使用的 ios 低于 ios9,所以我不能使用 UIStackView 有没有其他选项可以做到这一点?
  • 我想不出任何方法可以通过故事板做到这一点。我建议学习如何通过代码编辑布局。
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2017-01-25
相关资源
最近更新 更多