2017-04-22 95 views
-2

我創建UIKit對象編程,如UIButtonUIViewUILabels
有時候,我需要使用具有相同的屬性多次同樣的觀點。,呼叫對象的UIKit多次

例子:

如果我需要創建一個textField周圍的邊框線,我創建的UIView一個實例:

let textFieldTopViewSeparator: UIView = { 
    let view = UIView() 
    view.backgroundColor = UIColor.gray 
    view.translatesAutoresizingMaskIntoConstraints = false 
    return view 
}() 

然後,設置它的約束:

func textFieldTopViewSeparatorConstraints() { 
    textFieldTopViewSeparator.heightAnchor.constraint(equalToConstant: 1).isActive = true 
    textFieldTopViewSeparator.topAnchor.constraint(equalTo: self.textField.topAnchor).isActive = true 
    textFieldTopViewSeparator.widthAnchor.constraint(equalTo: self.textField.widthAnchor).isActive = true 
    textFieldTopViewSeparator.centerXAnchor.constraint(equalTo: self.textField.centerXAnchor).isActive = true 
} 

並致電viewDidLoad()

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.view.addSubview(textFieldTopViewSeparator) 
    textFieldTopViewSeparatorConstraints() 
} 

這隻會在textField的頂部創建一個邊界,然後創建一個底部有一個,我需要建立另一種觀點,給它的約束,並在viewDidLoad()

再次打電話給他們所以我的問題是,有沒有辦法只創建一個視圖的實例,並多次使用它與不同的約束?即使以不同的方式來創建視圖。

+0

如果要添加兩個標籤,那麼你需要創建兩個'UILabel'實例。 – rmaddy

+0

但是,在1視圖控制器中創建相同實例的那種冗餘可能是6次。 – MEnnabah

+0

爲什麼?你需要獨特的實例。一個視圖只能有一個框架。 – rmaddy

回答

0

A UIView只允許有一個父視圖。所以不,不可能多次使用UIView

Apple Documentation of addSubview()

視圖只能有一個上海華。如果視圖已經有一個超級視圖,並且該視圖不是接收者,則在使接收者成爲新的超級視圖之前,此方法將刪除先前的超級視圖。

+0

這並沒有解決問題,因爲所有有問題的視圖都有相同的父項。 – rmaddy

+0

?我不明白你的評論。那麼如何添加到父項是一個使用的視圖?每當你把它添加到另一個視圖(你必須如果你想顯示它),以前的連接不會丟失。所以它在我看來完全回答了這個問題。 – ObjectAlchemist

+0

OP想要創建一個視圖的單個實例,然後將其多次添加到單個父視圖。當然這是不可能的。但是你的回答意味着這是不可能的,因爲一個視圖不能有多個父代。在OP的情況下,這不是限制因素,因爲他們已經計劃只有一個父視圖。但是,您仍然無法多次向單個父級添加單個視圖。 – rmaddy

1

在我看來,你只想在UITextField的頂部和底部有一個border。你正在接近這個錯誤。我會建議一個不同的解決方案。

Objective-C代碼:

CALayer *bottomBorder = [CALayer layer]; 
bottomBorder.frame = CGRectMake(0.0f, self.frame.size.height - 1, self.frame.size.width, 1.0f); 
bottomBorder.backgroundColor = [UIColor blackColor].CGColor; 
[myTextField.layer addSublayer:bottomBorder]; 

斯威夫特代碼:

var bottomBorder = CALayer() 
bottomBorder.frame = CGRectMake(0.0, textField.frame.size.height - 1, textField.frame.size.width, 1.0); 
bottomBorder.backgroundColor = UIColor.blackColor().CGColor 
textField.layer.addSublayer(bottomBorder) 

你也可以做頂行這種方式。

但這個答案由「Aviel Gross"應該符合您需求的最佳:

class FramedTextField: UITextField { 

    @IBInspectable var linesWidth: CGFloat = 1.0 { didSet{ drawLines() } } 

    @IBInspectable var linesColor: UIColor = UIColor.blackColor() { didSet{ drawLines() } } 

    @IBInspectable var leftLine: Bool = false { didSet{ drawLines() } } 
    @IBInspectable var rightLine: Bool = false { didSet{ drawLines() } } 
    @IBInspectable var bottomLine: Bool = false { didSet{ drawLines() } } 
    @IBInspectable var topLine: Bool = false { didSet{ drawLines() } } 



    func drawLines() { 

     if bottomLine { 
      add(CGRectMake(0.0, frame.size.height - linesWidth, frame.size.width, linesWidth)) 
     } 

     if topLine { 
      add(CGRectMake(0.0, 0.0, frame.size.width, linesWidth)) 
     } 

     if rightLine { 
      add(CGRectMake(frame.size.width - linesWidth, 0.0, linesWidth, frame.size.height)) 
     } 

     if leftLine { 
      add(CGRectMake(0.0, 0.0, linesWidth, frame.size.height)) 
     } 

    } 

    typealias Line = CGRect 
    private func add(line: Line) { 
     let border = CALayer() 
     border.frame = line 
     border.backgroundColor = linesColor.CGColor 
     layer.addSublayer(border) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     drawLines() 
    } 

} 

你找到關於此主題在這裏更多的信息:UITextField Only Top And Bottom Border