Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

วิธีสร้าง UITextView ที่เลื่อนได้ (Scrollable) ใน iOS

UITextView สืบทอดจาก UIScrollView เลื่อนได้อัตโนมัติเมื่อข้อความยาวกว่าพื้นที่ แต่อยู่ที่ต้องตั้งค่าให้ถูกต้อง

Storyboard Setup

  1. ลาก Text View จาก Object Library
  2. Attributes Inspector → ติ๊ก Scrolling Enabled ✓
  3. ติ๊ก User Interaction Enabled ✓
  4. ตั้ง 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