2017-02-07 16 views
0

Я пытаюсь применить одну нижнюю границу к текстовому полю, который находится внутри одного из моих collectionViewCells. Вот код:Одиночная граница для UITextField в UIcollectionViewCell (быстрый x xode)

class AddressCell: UICollectionViewCell { 


override init(frame: CGRect) { 
    super.init(frame: frame) 
    setupViews() 
} 


func basicTextField(placeHolderString: String) -> UITextField { 
    let textField = UITextField() 
    textField.font = UIFont.boldSystemFont(ofSize: 12) 
    textField.attributedPlaceholder = NSAttributedString(string: placeHolderString, attributes:[NSForegroundColorAttributeName: UIColor.lightGray, NSFontAttributeName: UIFont.boldSystemFont(ofSize: 12)]) 
    textField.backgroundColor = UIColor.white 
    textField.translatesAutoresizingMaskIntoConstraints = false 
    return textField 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

func setupViews() { 
    backgroundColor = UIColor.white 
    layer.addBorder(edge: UIRectEdge.bottom, color: .black, thickness: 0.5) 

    let streetTextfield = basicTextField(placeHolderString: "street") 

    addSubview(streetTextfield) 
} 

}

Я использую расширение, которое позволяет мне применять единую границу, которая работала большой до сих пор:

extension CALayer { 

func addBorder(edge: UIRectEdge, color: UIColor, thickness: CGFloat) { 

    let border = CALayer() 

    switch edge { 
    case UIRectEdge.top: 
     border.frame = CGRect.init(x: 0, y: 0, width: frame.width, height: thickness) 
     break 
    case UIRectEdge.bottom: 
     border.frame = CGRect.init(x: 0, y: frame.height - thickness, width: frame.width, height: thickness) 
     break 
    case UIRectEdge.left: 
     border.frame = CGRect.init(x: 0, y: 0, width: thickness, height: frame.height) 
     break 
    case UIRectEdge.right: 
     border.frame = CGRect.init(x: frame.width - thickness, y: 0, width: thickness, height: frame.height) 
     break 
    default: 
     break 
    } 

    border.backgroundColor = color.cgColor; 

    self.addSublayer(border) 
} 

}

Когда я просто добавляю borderWidth к текстовому полю следующим образом:

textField.layer.borderWidth = 0.5 

Я получаю границу, и она отлично выглядит. Однако, когда я применяю расширение для добавления нижней границы, например:

textField.layer.addBorder(edge: UIRectEdge.bottom, color: .black, thickness: 0.5) 

По какой-то причине граница не применяется.

+0

Где вы звоните 'textField.layer.addBorder (край: UIRectEdge.bottom, цвет: .black, толщина: 0,5)'? – thexande

ответ

0

Я не уверен в расширении, но у меня есть рабочее решение для TextField с нижней границей.

в основном создать класс BottomBorderedTextField подклассов UITextField и вставьте следующий код:

class BottomBorderedTextField: UITextField { 

    override func draw(_ rect: CGRect) { 

     super.draw(rect) 

     //this is the color of the bottom border. Change to whatever you what 
     let color: UIColor = UIColor.rgb(red: 230, green: 230, blue: 230) 

     let bottomBorder = CALayer() 

     bottomBorder.frame = CGRect(x: 0, y: bounds.size.height - 1, width: bounds.size.width, height: 2) 

     bottomBorder.backgroundColor = color.cgColor 

     self.layer.addSublayer(bottomBorder) 

    } 
} 

Тогда на вашей basicTextField функции установите тип возвращаемого в BottomBorderedTextField класс, который вы только что сделали. так что ваш новый код будет выглядеть следующим образом:

func basicTextField(placeHolderString: String) -> BottomBorderedTextField { 
    let textField = BottomBorderedTextField() 
    textField.font = UIFont.boldSystemFont(ofSize: 12) 
    textField.attributedPlaceholder = NSAttributedString(string: placeHolderString, attributes:[NSForegroundColorAttributeName: UIColor.lightGray, NSFontAttributeName: UIFont.boldSystemFont(ofSize: 12)]) 
    textField.backgroundColor = UIColor.white 
    textField.translatesAutoresizingMaskIntoConstraints = false 
    return textField 
} 
+0

Я предполагаю, что вы имели в виду «let textField = BottomBorderedTextField()». Я просто добавил его, и это сработало! Вы знаете, почему моя работа не работает? И почему это решение сработало? – rob8989

0

Я написал UIView расширение, который выполняет ту же самую вещь:

extension UIView { 

    func addBottomBorder(width: CGFloat, color: UIColor, alpha: CGFloat) { 
     let border = CALayer() 
     let width = width 
     border.borderColor = color.withAlphaComponent(alpha).cgColor 
     border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) 
     border.borderWidth = width 
     self.layer.addSublayer(border) 
     self.layer.masksToBounds = true 
    } 
} 

Использование:

usernameField.addBottomBorder(width: 2.0, color: UIColor.white, alpha: 0.5) 

Кроме того, кажется, в setupViews() вы вызов:

layer.addBorder... //this is being called on the collection view cells layer 

В противоположность:

streetTextfield.layer.addBorder... 
+0

К сожалению, это не сработало для меня, но решение Кенни Гундермана сделало трюк! Спасибо. – rob8989

 Смежные вопросы

  • Нет связанных вопросов^_^