iOS 视野宽度计算不正确

iOS width of view not calculating correctly

我有一个带有子视图的视图,该视图旨在向用户显示他们在游戏中获胜和失败的比例,如下所示: 绿色视图的宽度是通过将父视图的宽度乘以赢得游戏的分数(在本例中为 .5),并将绿色视图的宽度约束更改为计算值来计算的。

let percent = Float(won)/Float(self.partiesPlayed)  //percent of games won, should be .5
let width = CGFloat(percent) * self.winLoseView.bounds.size.width  //multiply width of superview by percent

self.greenWidthConstraint.constant = CGFloat(width)  //change constraint's constant
UIView.animateWithDuration(2, animations: {  // animate change
    self.view.layoutIfNeeded()
})

问题是宽度似乎不完全正确,例如在这个例子中它似乎不正好是父视图的一半。

这是另一种方法:为什么不直接删除 greenWidthConstraint 并使用等于红色视图宽度的约束重新应用它,并将乘数设置为获胜百分比。这样,如果您支持旋转或任何其他大小更改,您就不必担心固定宽度值常量。我还没有达到 swift 的水平,但在 Objective-c 中:

[self.view removeConstraint:self.constraint];
self.constraint = [NSLayoutConstraint constraintWithItem:self.greenView
                                               attribute:NSLayoutAttributeWidth
                                               relatedBy:NSLayoutRelationEqual
                                                  toItem:self.redView
                                               attribute:NSLayoutAttributeWidth
                                              multiplier:PERCENTAGE
                                                constant:0];
[self.view addConstraint:self.constraint];

// Animate the layoutIfNeeded....

这是 Swift 版本:(由@milesper 提供)

let percent = Float(won)/Float(self.partiesPlayed)
var constraint = NSLayoutConstraint(item: self.greenSection, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: self.winLoseView, attribute: NSLayoutAttribute.Width, multiplier: CGFloat(percent), constant: 0.0 as CGFloat)
self.view.addConstraint(constraint)
UIView.animateWithDuration(2, animations: {
     self.view.layoutIfNeeded()
})