Tôi biết đã có rất nhiều câu trả lời cho câu hỏi này, nhưng tôi thực sự không tìm thấy câu trả lời nào đủ (ít nhất là trong Swift). Tôi muốn một giải pháp cung cấp đường viền chính xác giống như UITextField (không phải là một giải pháp gần đúng trông giống như bây giờ, nhưng một giải pháp trông giống hệt nó và sẽ luôn trông giống hệt nó). Tôi cần sử dụng UITextField để sao lưu UITextView cho nền, nhưng không muốn tạo riêng biệt mỗi lần.
Giải pháp dưới đây là UITextView cung cấp UITextField của riêng nó cho đường viền. Đây là phiên bản rút gọn của giải pháp đầy đủ của tôi (có thêm hỗ trợ "giữ chỗ" cho UITextView theo cách tương tự) và đã được đăng ở đây: 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
và chỉ tắtuserInteractionEnabled
?