2017-04-15 47 views
2

目前我使用這行代碼上設置在左上角一個UILabel原點...NSLayoutConstraints 3.0

addConstraint(NSLayoutConstraint(item: messageLabel, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 

但是我想的起源是從左邊0像素H和一半的高度,如果這是有道理的。

有什麼建議嗎?我試圖改變乘數無濟於事。

我想要做的是移動原點,使得(0,0)不是左上角,而是標籤的最左側和標籤高度的一半,以便我可以正確地將標籤居中。

+1

我建議你修改你的代碼,以便人們可以閱讀它而不會發生荒謬的滾動。我拒絕按照原樣閱讀。 – gnasher729

回答

1

只是爲了澄清,你需要的標籤左對齊,並居中從上到下?您是否看過NSLayoutAnchor

messageLabel = UILabel(/* Initialized somehow */) 
messageLabel.translatesAutoresizingMaskIntoConstraints = false 

view.addSubview(messageLabel) 
view.centerYAnchor.constraint(equalTo: messageLabel.centerYAnchor).isActive = true 
view.leadingAnchor.constraint(equalTo: messageLabel.leadingAnchor).isActive = true 
0

首先,您必須將視圖添加爲其容器的子視圖。完成此操作後,您需要將translatesAutoResizingMaskToConstraints設置爲false。那麼現在是時候添加你NSLayoutConstraints

let labelWidth:CGFloat = 320 
    let labelHeight:CGFloat = 30 
    // Container is what you are adding label too 
    let container = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500)) 
    let label = UILabel(frame: CGRect(x: 0, y: (container.frame.size.height/2) - (labelHeight/2), width: labelWidth, height: labelHeight)) 
    container.addSubview(label) 
    label.translatesAutoresizingMaskIntoConstraints = false 

    // Add Width and Height (IF is required, 
    // if not required, anchor your label to appropriately) 
    label.addConstraints([ 
     NSLayoutConstraint.init(item: label, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: labelWidth), 
     NSLayoutConstraint.init(item: label, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: labelHeight), 
    ]) 

    label.layoutIfNeeded() 

    // Add left constraint and center in container constraint 
    container.addConstraints([ 
     NSLayoutConstraint.init(item: label, attribute: .left, relatedBy: .equal, toItem: .container, attribute: .left, multiplier: 1.0, constant: 0.0), 
     NSLayoutConstraint.init(item: label, attribute: .centerX, relatedBy: .equal, toItem: .container, attribute: .left, multiplier: 1.0, constant: 0.0) 
    ]) 

    container.layoutIfNeeded() 

編輯

是的,有當您使用點語法通過Xcode的自動給你的文檔。如果您轉到屬性的參數並輸入句點,則會看到所有可能選項的下拉列表。

enter image description here

+0

你指的是哪個常量?如果您的意思是標籤的寬度和高度,我將其設置在代碼的最頂端。 –

+0

有沒有在我可以看到NSLayoutConstraints的所有可能的屬性的文檔中的任何地方? – Stefan

+0

@Stefan我更新了我的答案 –

0

嘗試設置您的標籤的來源與此:

messageLabel.horizontalAlignmentMode = .Left 
messageLabel.position = CGPoint(x:0.0, y:self.size.height) 

沒有必要的約束!

希望有所幫助你:)

+0

如果您的應用程序被鎖定旋轉,那麼對於約束**沒有* need *。這意味着您的應用只有一個*方向設置,橫向或縱向。如果你想允許你的應用程序中的方向改變,你真的需要使用自動佈局。唯一的其他選擇是聽取系統中的方向更改並手動調整UI元素的位置。這是非常乏味的,在自動佈局轉換過程中不夠優雅,而且在iOS開發的今天,不使用自動佈局是一個重大錯誤。 –

+0

由於不需要乘數或常數,所以不需要約束。斯蒂芬只是想設置按鈕頂部讓角落就是它 – chetan

+0

沒有適當的限制標籤框架將保持不變的方向改變。是的,你可以添加它,但最初的問題是關於NSLayoutConstraint。 –

相關問題