布局约束不起作用和/或失败

时间:2015-03-26 23:28:39

标签: ios autolayout constraints

我一直试图让这种拉动以刷新控制为中心一段时间,我似乎无法让约束起作用。我在这里完全遗漏了什么吗?我阅读了一些教程,并在另一个问题中阅读,通常您会向父对象添加位置约束。当我尝试将约束添加到刷新控件时,它告诉我它无法满足约束。

// Set up the refresh control and add it to the tableView
self.refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(refreshControl)

// Center the refreshControl
var centerControl: NSLayoutConstraint = NSLayoutConstraint(
 item: refreshControl,
 attribute: NSLayoutAttribute.CenterX, 
 relatedBy: NSLayoutRelation.Equal, 
 toItem: tableView, 
 attribute: NSLayoutAttribute.CenterX, multiplier: 1.0, constant: 1.0)
tableView.addConstraint(centerControl)

编辑:我试图像建议的那样设置refreshControl的大小,它仍然显示在右边,就像600宽度一样,如Any Height Any Width视图控制器。因此,显然试图设置大小没有任何改变

更新的代码:

override func viewDidLoad() {
super.viewDidLoad()

// Set tableView delegate and dataSource
tableView.delegate = self
tableView.dataSource = self

// Set up the refresh control and add it to the tableView
self.refreshControl = UIRefreshControl(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 40))
self.refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(refreshControl)

// Center the refreshControl
let centerControl: NSLayoutConstraint = NSLayoutConstraint(
  item: refreshControl, 
  attribute: NSLayoutAttribute.CenterX, 
  relatedBy: NSLayoutRelation.Equal, 
  toItem: refreshControl.superview, 
  attribute: NSLayoutAttribute.CenterX, multiplier: 1.0, constant: 0)
refreshControl.superview?.addConstraint(centerControl)

}

代码更新#2:我已经尝试了这个并且它也没有用。我应该有一个tableViewController来管理refreshControl吗?当我添加任何这些约束(甚至单独)时,刷新控件会随表一起拖动。当我不添加约束时,它会保持不变。我想要的只是获得它所以图像和文字并不是一直到右边!否则它会起作用。

override func viewDidLoad() {
super.viewDidLoad()

// Set tableView delegate and dataSource
tableView.delegate = self
tableView.dataSource = self

// Set up the refresh control and add it to the tableView
refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
tableView.addSubview(refreshControl)
refreshControl.setTranslatesAutoresizingMaskIntoConstraints(false)

// Create the constraints and add them
var constX: NSLayoutConstraint =
  NSLayoutConstraint(item: refreshControl,
                attribute: NSLayoutAttribute.CenterX,
                relatedBy: NSLayoutRelation.Equal,
                   toItem: tableView,
                attribute: NSLayoutAttribute.CenterX,
               multiplier: 1.0, constant: 0)
tableView.addConstraint(constX)

var constW: NSLayoutConstraint =
  NSLayoutConstraint(item: refreshControl,
                attribute: NSLayoutAttribute.Width,
                relatedBy: NSLayoutRelation.Equal,
                   toItem: tableView,
                attribute: NSLayoutAttribute.Width,
               multiplier: 1.0, constant: 0)
tableView.addConstraint(constW)

var constH: NSLayoutConstraint =
  NSLayoutConstraint(item: refreshControl,
                attribute: NSLayoutAttribute.Height,
                relatedBy: NSLayoutRelation.Equal,
                   toItem: nil,
                attribute: NSLayoutAttribute.NotAnAttribute,
               multiplier: 1.0, constant: 50)
tableView.addConstraint(constH)

}

3 个答案:

答案 0 :(得分:1)

尝试禁用自动调整遮罩约束:

self.refreshControl.setTranslatesAutoresizingMaskIntoConstraints(false)

答案 1 :(得分:0)

您只需将约束设置为使用parent水平居中刷新控件。

您还需要设置

  1. 关于superview的刷新控制的最大空间
  2. 刷新控制的宽度和高度。

答案 2 :(得分:0)

实际上,您不必自己设置UIRefreshControl的框架或约束。

您需要一个UITableViewController并使用您的实例设置refreshControl属性。

示例:

let tableViewController = UITableViewController()
tableViewController.refreshControl = UIRefreshControl()

TableViewController负责管理refreshControl: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewController_Class/index.html#//apple_ref/occ/instp/UITableViewController/refreshControl