Eu sei que já existem muitas respostas para essa, mas realmente não achei nenhuma delas suficiente (pelo menos em Swift). Eu queria uma solução que fornecesse a mesma borda exata que um UITextField (não uma aproximada que pareça mais ou menos agora, mas uma que seja exatamente igual e sempre será exatamente igual). Eu precisava usar um UITextField para fazer backup do UITextView para o segundo plano, mas não queria criar isso separadamente todas as vezes.
A solução abaixo é um UITextView que fornece seu próprio UITextField para a borda. Esta é uma versão reduzida da minha solução completa (que adiciona suporte de "espaço reservado" ao UITextView de maneira semelhante) e foi publicada aqui: 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
e simplesmente desligaruserInteractionEnabled
?