【问题标题】:Swift programmatically adding constraints to labelsSwift 以编程方式向标签添加约束
【发布时间】:2015-09-17 18:29:17
【问题描述】:

我在 for index 循环中,并根据每个索引项添加标签。因为我以编程方式添加这些标签,所以我不知道如何将它们限制在设备宽度的最右侧。我在下面解释我认为约束是如何起作用的。 我的目标 = 将超级视图(或包含视图)常量设置为 8 的尾随空格。

let y_align = 340 * index + 70
let x_align = self.deviceWidth - 110
var derp = UILabel(frame: CGRectMake(0, 0, 200, 21))
derp.center = CGPointMake(CGFloat(x_align), CGFloat(y_align))    
derp.textAlignment = NSTextAlignment.Right    
derp.text = json["things"][index]["thing"].string!    
self.some_view_container.addSubview(derp)

//now this is what I understand about constraints    
let xconstraint = NSLayoutConstraint(    
    item: derp, //-- the object that we want to constrain    
    attribute: NSLayoutAttribute.Trailing, //-- the attribute of the object we want to constrain    
    relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object    
    toItem: some_view_container, //-- this is the different object we want to constrain to    
    attribute: NSLayoutAttribute.Right, //-- the attribute of the different object    
    multiplier: 1, //-- multiplier    
    constant: 8 //-- regular constant    
)

derp.addConstraint(xconstraint)

这就是我想要的人性

  • item:我想约束 json 值的 derp
  • 属性:我想限制它的尾随空格,使其一直向右推
  • relatedBy:这里不知道,我不在乎它是否与任何东西相关,因为我只想要超级视图的尾随空格
  • toItem:我想把它推到 superview 的右边,或者它的容器是 some_view_container
  • 属性:这里不知道,我不关心视图容器的属性
  • 乘数:我只想要常数的个数,所以乘以 1
  • 常量:我希望尾随空间距离边缘 8 度

【问题讨论】:

    标签: swift constraints labels


    【解决方案1】:

    您可以将此代码作为参考:

    import UIKit
    
    class ViewController: UIViewController {
     override func viewDidLoad() {
        super.viewDidLoad()
        addLabels()
     }
    
     func addLabels(){
        let deviceWidth = UIScreen.mainScreen().bounds.width
        //Here recopilate the constranins for later activation
        var constraints = [NSLayoutConstraint]()
        //Here I'm assuming that there are 5 labels
        for index in 0..<5 {
            //adjust this to spaciate labels
            let y_align = CGFloat(20 * index + 70)
            let x_align = deviceWidth - 110
            var derp = UILabel(frame: CGRectMake(0, 0, 200, 21))
            derp.center = CGPointMake(CGFloat(x_align), CGFloat(y_align))
            derp.textAlignment = NSTextAlignment.Right
            derp.text = "things \(index)"
    
            let xconstraint = NSLayoutConstraint(
                item: derp, //-- the object that we want to constrain
                attribute: NSLayoutAttribute.Trailing, //-- the attribute of the object we want to constrain
                relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object
                toItem: self.view, //-- this is the different object we want to constrain to
                attribute: NSLayoutAttribute.Right, //-- the attribute of the different object
                multiplier: 1, //-- multiplier
                constant: -8 //-- (Take a look here, its a minus)
            )
            let yconstraint = NSLayoutConstraint(
                item: derp, //-- the object that we want to constrain
                attribute: NSLayoutAttribute.Top, //-- the attribute of the object we want to constrain
                relatedBy: NSLayoutRelation.Equal, //-- how we want to relate THIS object to A DIFF object
                toItem: self.view, //-- this is the different object we want to constrain to
                attribute: NSLayoutAttribute.TopMargin, //-- the attribute of the different object
                multiplier: 1, //-- multiplier
                constant: y_align //-- regular constant
            )
            //recopilate constraints created here
            constraints.append(xconstraint)
            constraints.append(yconstraint)
            derp.setTranslatesAutoresizingMaskIntoConstraints(false)
            //add them to the desired control
            self.view.addSubview(derp)
        }
        //This will tell iOS to use your constraint
        NSLayoutConstraint.activateConstraints(constraints)
     }
    }
    

    【讨论】:

    • 非常感谢!你就是那个男人,正是我要找的人!
    【解决方案2】:

    适用于 Swift 3.0

    func addLabels(){
        let deviceWidth = UIScreen.main.bounds.width
        //Here recopilate the constranins for later activation
        var constraints = [NSLayoutConstraint]()
        //Here I'm assuming that there are 5 labels
        for index in 0..<5 {
            //adjust this to spaciate labels
            let y_align = CGFloat(20 * index + 70)
            let x_align = deviceWidth - 110
            var derp = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
            derp.center = CGPoint(x:CGFloat(x_align), y:CGFloat(y_align))
    
            derp.textAlignment = NSTextAlignment.right
            derp.text = "things \(index)"
    
            let xconstraint = NSLayoutConstraint(
                item: derp, //-- the object that we want to constrain
                attribute: NSLayoutAttribute.trailing, //-- the attribute of the object we want to constrain
                relatedBy: NSLayoutRelation.equal, //-- how we want to relate THIS object to A DIFF object
                toItem: self.view, //-- this is the different object we want to constrain to
                attribute: NSLayoutAttribute.right, //-- the attribute of the different object
                multiplier: 1, //-- multiplier
                constant: -8 //-- (Take a look here, its a minus)
            )
            let yconstraint = NSLayoutConstraint(
                item: derp, //-- the object that we want to constrain
                attribute: NSLayoutAttribute.top, //-- the attribute of the object we want to constrain
                relatedBy: NSLayoutRelation.equal, //-- how we want to relate THIS object to A DIFF object
                toItem: self.view, //-- this is the different object we want to constrain to
                attribute: NSLayoutAttribute.topMargin, //-- the attribute of the different object
                multiplier: 1, //-- multiplier
                constant: y_align //-- regular constant
            )
            //recopilate constraints created here
            constraints.append(xconstraint)
            constraints.append(yconstraint)
            derp.translatesAutoresizingMaskIntoConstraints = false
            //add them to the desired control
            self.view.addSubview(derp)
        }
        //This will tell iOS to use your constraint
        NSLayoutConstraint.activate(constraints)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多