Sé que ya hay muchas respuestas a esta, pero realmente no encontré ninguna de ellas suficiente (al menos en Swift). Quería una solución que proporcionara el mismo borde exacto que un UITextField (no una aproximada que se vea más o menos como se ve ahora, pero una que se ve exactamente igual y siempre se verá exactamente igual). Necesitaba usar un UITextField para respaldar el UITextView para el fondo, pero no quería tener que crearlo por separado cada vez.
La solución a continuación es un UITextView que proporciona su propio UITextField para el borde. Esta es una versión reducida de mi solución completa (que agrega soporte de "marcador de posición" al UITextView de manera similar) y se publicó aquí: https://stackoverflow.com/a/36561236/1227119
// This class implements a UITextView that has a UITextField behind it, where the
// UITextField provides the border.
//
class TextView : UITextView, UITextViewDelegate
{
var textField = TextField();
required init?(coder: NSCoder)
{
fatalError("This class doesn't support NSCoding.")
}
override init(frame: CGRect, textContainer: NSTextContainer?)
{
super.init(frame: frame, textContainer: textContainer);
self.delegate = self;
// Create a background TextField with clear (invisible) text and disabled
self.textField.borderStyle = UITextBorderStyle.RoundedRect;
self.textField.textColor = UIColor.clearColor();
self.textField.userInteractionEnabled = false;
self.addSubview(textField);
self.sendSubviewToBack(textField);
}
convenience init()
{
self.init(frame: CGRectZero, textContainer: nil)
}
override func layoutSubviews()
{
super.layoutSubviews()
// Do not scroll the background textView
self.textField.frame = CGRectMake(0, self.contentOffset.y, self.frame.width, self.frame.height);
}
// UITextViewDelegate - Note: If you replace delegate, your delegate must call this
func scrollViewDidScroll(scrollView: UIScrollView)
{
// Do not scroll the background textView
self.textField.frame = CGRectMake(0, self.contentOffset.y, self.frame.width, self.frame.height);
}
}
UITextField
y simplemente apagaruserInteractionEnabled
?