2017-07-05 71 views
0

我想創建兩個只有底部邊框的UITextFields,我從另一個StackOverflow獲得了一些代碼並且它工作正常。但是,當我複製並粘貼代碼時,我的第二個TextField只顯示一個帶有底部邊框的TextField。創建只有底部邊框swift的兩個文本字段

下面是代碼:

let border = CALayer() 
let width = CGFloat(2.0) 
border.borderColor = UIColor.gray.cgColor 
border.frame = CGRect(x: 0, y: emailText.frame.size.height - 
width, width: emailText.frame.size.width, height: 
emailText.frame.size.height) 

border.frame = CGRect(x: 0, y: passwordText.frame.size.height 
- width, width: passwordText.frame.size.width, height: 
passwordText.frame.size.height) 

    border.borderWidth = width 
    passwordText.layer.addSublayer(border) 
    passwordText.layer.masksToBounds = true 

    border.borderWidth = width 
    emailText.layer.addSublayer(border) 
    emailText.layer.masksToBounds = true 

感謝您的幫助!

+0

你不能對這兩個文本字段使用相同的vie。爲第二個邊框使用邊框的副本。使這項工作最簡單的方法是將一個變量細化爲border2並將其設置爲子圖層。 – Gihan

+0

您的問題*很可能*您只創建了一個* border *實例,並且它不能被添加到兩個'UITextFields。你有幾個選擇 - (1)創建border的第二個實例,子類「UITextField」並讓子類有一個下邊框。它可能是「更清潔」(或更多OOP)的子類,但如果你不想重用這種類型的文本字段,除了在兩個實例中,創建兩個實例更容易 - 但將它們命名爲「pwBorder」和「emailBorder」明晰。 – dfd

+0

@CalvinChange更改它,因爲你分配邊框,然後再分配它,所以它會得到覆蓋新的框架大小。 –

回答

1

CALayer s是基於實例的,這意味着如果將圖層添加到視圖中,則無法將其添加到新圖層,而無需將其從第一個視圖中移除。創建CALayer s或更好的兩個實例,然後進行擴展以產生所需的結果。

0

爲電子郵件文本字段和用戶名文本字段創建單獨的邊框對象。

let emailborder = CALayer() 
let passwordborder = CALayer() 

let width = CGFloat(2.0) 
emailborder.borderColor = UIColor.gray.cgColor 
emailborder.frame = CGRect(x: 0, y: emailText.frame.size.height - 
width, width: emailText.frame.size.width, height: 
emailText.frame.size.height) 

passwordborder.frame = CGRect(x: 0, y: passwordText.frame.size.height 
- width, width: passwordText.frame.size.width, height: 
passwordText.frame.size.height) 

passwordborder.borderWidth = width 
passwordText.layer.addSublayer(passwordborder) 
passwordText.layer.masksToBounds = true 

emailborder.borderWidth = width 
emailText.layer.addSublayer(emailborder) 
emailText.layer.masksToBounds = true 
0

你不能對這兩個文本字段使用相同的視圖。爲第二個邊框使用邊框的副本。使這項工作最簡單的方法是將一個變量細化爲border2並將其設置爲子圖層。不要忘記刪除重複的框架分配爲寄宿生。

let border = CALayer() 
let width = CGFloat(2.0) 
border.borderColor = UIColor.gray.cgColor 
border.frame = CGRect(x: 0, y: emailText.frame.size.height - width, width: emailText.frame.size.width, height: emailText.frame.size.height) 

let border2 = CALayer() border2.borderColor = border.borderColor border2.frame = border.frame; 

border.borderWidth = width 
passwordText.layer.addSublayer(border) 
passwordText.layer.masksToBounds = true 

border.borderWidth = width 
emailText.layer.addSublayer(border2) 
emailText.layer.masksToBounds = true 
0

你可以無需編寫代碼冗餘的最好的是,你創建一個函數,傳遞你想邊境的參數,並保持風格的代碼在那裏,像這樣的文本框:

func setBorder(tf: UITextField) { 

    let border = CALayer() 
    let width = CGFloat(2.0) 

    border.borderColor = UIColor.gray.cgColor 
    border.frame = CGRect(x: 0, y: tf.frame.size.height - width, 
    width: tf.frame.size.width, height: 
    tf.frame.size.height) 
    border.borderWidth = width 

    tf.layer.addSublayer(border) 
    tf.layer.masksToBounds = true 
} 

調用此功能在viewDidLoad:

setBorder(tf: emailText) 
setBorder(tf: passwordText) 

希望這有助於!