UITextView สืบทอดจาก UIScrollView เลื่อนได้อัตโนมัติเมื่อข้อความยาวกว่าพื้นที่ แต่อยู่ที่ต้องตั้งค่าให้ถูกต้อง
Storyboard Setup
- ลาก Text View จาก Object Library
- Attributes Inspector → ติ๊ก Scrolling Enabled ✓
- ติ๊ก User Interaction Enabled ✓
- ตั้ง Constraints: Top, Leading, Trailing, Bottom (หรือ Height)
โค้ด (Programmatic)
let textView = UITextView()
textView.isScrollEnabled = true
textView.isUserInteractionEnabled = true
textView.isEditable = false // Read-only
textView.font = .systemFont(ofSize: 16)
textView.textColor = .label
textView.backgroundColor = .systemBackground
// Long Text
textView.text = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident.
"""
view.addSubview(textView)
textView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
textView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
textView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
textView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20)
])
Auto Height (Fit Content)
// ปิด Scroll ให้สูงเท่าข้อความ
textView.isScrollEnabled = false
textView.sizeToFit()
// หรือ
let size = textView.sizeThatFits(CGSize(width: view.bounds.width - 40, height: .greatestFiniteMagnitude))
textView.heightAnchor.constraint(equalToConstant: size.height).isActive = true
Keyboard Handling
// ปิด Keyboard ตอน Scroll
textView.keyboardDismissMode = .interactive // หรือ .onDrag
// Toolbar บน Keyboard
let toolbar = UIToolbar()
toolbar.sizeToFit()
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(dismissKeyboard))
let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
toolbar.items = [flexible, doneButton]
textView.inputAccessoryView = toolbar
@objc func dismissKeyboard() { view.endEditing(true) }
Attributed Text + Scroll
let attributed = NSMutableAttributedString(string: "Long text...", attributes: [.font: UIFont.systemFont(ofSize: 16)])
textView.attributedText = attributed
// Scroll ทำงานเหมือนกัน
Common Issues
- ไม่เลื่อน: เช็ค
isScrollEnabled = true, Constraints ถูกต้อง, Content Size > Frame - Bounce ไม่ได้:
alwaysBounceVertical = true - Keyboard บัง: ใช้
IQKeyboardManagerSwiftหรือ Keyboard Observer Adjust Inset