Я знаю, що на це вже є багато відповідей, але я насправді не знайшов жодної з них достатньою (принаймні у Свіфта). Я хотів рішення, яке забезпечило б таку ж точну межу, як і UITextField (не наближене, яке виглядає так, як зараз виглядає, але таке, яке виглядає саме так і завжди буде виглядати саме так). Мені потрібно було використовувати UITextField для резервного копіювання UITextView для фону, але не хотілося створювати це окремо кожен раз.
Нижче наведено рішення UITextView, яке забезпечує власне UITextField для кордону. Це обрізана версія мого повного рішення (яка додає підтримку UITextView до "заповнення місця" аналогічним чином) та була розміщена тут: 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
та просто вимкнутиuserInteractionEnabled
?