簡體   English   中英

如何將其從 swift 轉換為 objective-c?

[英]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

這與上面相同:您只是獲得了segmentedControlbottomAnchor屬性。 結果用作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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM