[英]How can I turn this from swift to objective-c?
我正在關注一個教程,但它在 swift 中,我正在研究的項目部分是用 Objective-C 編寫的。 我已經“翻譯”了一半的代碼,但我還不能更改這部分。
// Constrain the top of the button bar to the bottom of the segmented control
buttonBar.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor).isActive = true
buttonBar.heightAnchor.constraint(equalToConstant: 5).isActive = true
// Constrain the button bar to the left side of the segmented control
buttonBar.leftAnchor.constraint(equalTo: segmentedControl.leftAnchor).isActive = true
// Constrain the button bar to the width of the segmented control divided by the number of segments
buttonBar.widthAnchor.constraint(equalTo: segmentedControl.widthAnchor, multiplier: 1 / CGFloat(segmentedControl.numberOfSegments)).isActive = true
我已經有了這個,但我不知道如何放置.isActive
部分。
[buttonBar.topAnchor constraintEqual:_segmentedControl.bottomAnchor];
我該怎么做?
你應該能夠做到
[buttonBar.topAnchor constraintEqualToAnchor:_segmentedControl.bottomAnchor].active = YES;
Apple docs 通常是一個很好的起點:
https://developer.apple.com/documentation/uikit/nslayoutanchor?language=objc
為了回應您關於乘數的評論,請再次閱讀文檔。 例如向下滾動,我們看到:
筆記:
您永遠不會直接使用 NSLayoutAnchor class。 相反,根據您希望創建的約束類型,使用它的子類之一。
- 使用 NSLayoutXAxisAnchor 創建水平約束。
- 使用 NSLayoutYAxisAnchor 創建垂直約束。
- 使用 NSLayoutDimension 創建影響視圖高度或寬度的約束。
所以寬度和高度約束實際上是NSLayoutDimension
並且它們有額外的方法,特別是: constraintEqualToAnchor:multiplier:
即使您不想每次都參考文檔,自動完成也是您的朋友。 只需開始輸入類似[self.widthAnchor constraint
的內容,看看會發生什么
我不知道如何放置 .isActive 部分。
您引用的每一行都做了幾件事。 例如:
buttonBar.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor).isActive = true
您必須了解這里發生了什么,才能將其轉換為不同的語言。 讓我們從左到右分解它:
buttonBar
這是一個指向某種視圖的變量,大概是一個UIToolbar
,但只要它是一個視圖就沒有關系。
.topAnchor
您正在調用topAnchor
訪問器方法,該方法將返回一個NSLayoutAnchor
object(實際上是一個NSLayoutYAxisAnchor
對象)。 Objective-C 對訪問器具有類似的點語法,因此您也可以在此處說buttonBar.topAnchor
,但您也可以將其寫為[buttonBar topAnchor]
,這可能有助於您了解發生了什么。
.constraint(equalTo: ________)
這是對constraint(equalTo:)
方法的調用。 當涉及參數時,Objective-C 的點語法不起作用,因此您需要消息語法。 如果您不確定如何翻譯該名稱,只需查找 Swift 名稱,然后將文檔更改為顯示 Objective-C: constraintEqualToAnchor:
。 所以這部分轉換為[_____ constraintEqualToAnchor:_____]
。
segmentedControl.bottomAnchor
這與上面相同:您只是獲得了segmentedControl
的bottomAnchor
屬性。 結果用作constraintEqualToAnchor:
方法的參數。 讓我們把到目前為止的東西放在一起:
[[buttonBar topAnchor] constraintEqualTo:[segmentedControl bottomAnchor]]
換句話說,您告訴按鈕欄的頂部錨點創建一個約束,使其等於段控件的底部錨點。 該約束由constraintEqualTo:
方法返回,這將我們帶到最后一部分:
.isActive = true
在這里,您正在設置由constraintEqualTo:
返回的約束的isActive
屬性。 所以,在 Objective-C 中,你有:
[[[buttonBar topAnchor] constraintEqualTo:[segmentedControl bottomAnchor]] setActive:YES];
或者,使用 Obj-C 的點語法:
[buttonBar.topAnchor constraintEqualTo:segmentedControl.bottomAnchor].active = YES;
是的,但例如我如何在最后一行乘以?
最后一行是:
buttonBar.widthAnchor.constraint(equalTo: segmentedControl.widthAnchor, multiplier: 1 / CGFloat(segmentedControl.numberOfSegments)).isActive = true
如果您遵循以上所有內容,那么您可能會看到您確實在做同樣的事情,只是調用不同的方法來獲取約束。 該方法是 Swift 中的constraint(equalTo:multiplier:)
或 Objective-C 中的constraintEqualToAnchor:multiplier:
:。 所以做同樣的事情...
[_____ constraintEqualToAnchor:_____ multiplier:_____].active = YES;
現在只需填寫空白:
[buttonBar.widthAnchor constraintEqualToAnchor:segmentedControl.widthAnchor
multiplier:1/CGFloat(segmentedControl.numberOfSegments)].active = YES;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.