如何将约束更改为以编程方式创建的按钮?

How to change constraints to a button who has been created programatically?

我想使用以编程方式为该按钮创建的约束来移动以编程方式创建的按钮。但是我 运行 犯了几个错误。我能够对一个不是以编程方式创建的按钮执行此操作,该按钮也不是以编程方式创建的。代码如下:

var displayLink: CADisplayLink?
var startTime: CFAbsoluteTime?
let duration = 2.0
@IBOutlet var TopConstraintforMoving1: NSLayoutConstraint!  
@IBAction func Startbutton(sender: UIButton) {
    startDisplayLink()
}
func startDisplayLink() {
    displayLink?.invalidate()
    startTime = CFAbsoluteTimeGetCurrent()
    displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:")
    displayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
func handleDisplayLink(displayLink: CADisplayLink) {
    let elapsed = CFAbsoluteTimeGetCurrent() - startTime!
    var percentComplete = CGFloat(elapsed / duration)
    if percentComplete >= 1.0 {
        percentComplete = 1.0
        stopDisplayLink()
    }
    TopConstraintforMoving1.constant = 390 - 350 * percentComplete
}

这是我以编程方式创建的按钮的代码:

var startTime: CFAbsoluteTime?
let duration = 2.0
let button = UIButton(type: UIButtonType.System) as UIButton
var topConstraintforMoving1: NSLayoutConstraint?  
@IBAction func StartButton(sender: UIButton) {
    startTime = CFAbsoluteTimeGetCurrent()
    let elapsed = CFAbsoluteTimeGetCurrent() - startTime!
    var percentComplete = CGFloat(elapsed / duration)
    if percentComplete >= 1.0 {
        percentComplete = 1.0
    }
    button.setImage(UIImage(named: "BlueBall.png")!, forState: UIControlState.Normal)
    button.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
    view.addSubview(button)
    button.translatesAutoresizingMaskIntoConstraints = false      
    topConstraintforMoving1 = button.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 390 - 350 * percentComplete)  
    NSLayoutConstraint.activateConstraints([
        button.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: 122),
        button.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 393),
        button.widthAnchor.constraintEqualToConstant(75),
        button.heightAnchor.constraintEqualToConstant(75),
        ])      
} 

按钮没有移动。 请help.Thank你。安东

你走在正确的轨道上。在代码中创建按钮的代码中,您也在代码中创建约束。但是,您没有保存指向该约束的指针。

(函数 constraintEqualToAnchor 的 return 类型是 NSLayoutConstraint,但您没有在任何地方保存那个 return 值。)

创建实例变量并将约束保存到该变量。如果愿意,您甚至可以将约束标记为 IBOutlet。

然后像处理在 IB (Interface Builder) 中创建的按钮一样操作约束的常量值。

编辑:

您的代码可能如下所示:

TopConstraintforMoving1 = 
  button.topAnchor.constraintEqualToAnchor(
    view.topAnchor, 
    constant: 390 - 350 * percentComplete)

请注意,变量名应以小写字母开头,因此实际上应该是:

topConstraintforMoving1 = 
  button.topAnchor.constraintEqualToAnchor(
    view.topAnchor, 
    constant: 390 - 350 * percentComplete)

我尝试以不同的方式构建它,但使用相同的方法并且成功了。这是代码:

let button = UIButton()
var displayLink: CADisplayLink?
var startTime: CFAbsoluteTime?
let duration = 2.0
var topConstraint: NSLayoutConstraint!
@IBAction func start(sender: UIButton) {
    displayLink?.invalidate()
    startTime = CFAbsoluteTimeGetCurrent()
    displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:")
    displayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
}
func handleDisplayLink(displayLink: CADisplayLink) {
    button.hidden = false
    let elapsed = CFAbsoluteTimeGetCurrent() - startTime!
    var percentComplete = CGFloat(elapsed / duration)
    if percentComplete >= 1.0 {
        percentComplete = 1.0
        displayLink.invalidate()
        button.hidden = true
    }
    topConstraint.constant = 393 - 350 * percentComplete
    NSLayoutConstraint.activateConstraints([
        button.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: 122),
        topConstraint,
        button.widthAnchor.constraintEqualToConstant(75),
        button.heightAnchor.constraintEqualToConstant(75)
        ])
}
func buttonPressed(sender: UIButton!) {
    button.hidden = true
    displayLink?.invalidate()
}
override func viewDidLoad() {
    super.viewDidLoad()
    button.hidden = true
    button.setImage(UIImage(named: "BlueBall.png")!, forState: UIControlState.Normal)
    button.addTarget(self, action: "buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
    self.view.addSubview(button)
    button.translatesAutoresizingMaskIntoConstraints = false
    topConstraint = button.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 393)  
    NSLayoutConstraint.activateConstraints([
        button.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor, constant: 122),
        topConstraint,
        button.widthAnchor.constraintEqualToConstant(75),
        button.heightAnchor.constraintEqualToConstant(75)
        ])   
}