UITextView: nedir, çok satırlı giriş ve çalışma prensibi

Yazar: IT Sectr Yayınlanma: 2026-07-07 Okuma süresi: 8 dk

UITextView, UIScrollView'den miras alan ve bağlantılar ile görsellerin gömülmesiyle nitelikli metin düzenlemeyi destekleyen UIKit'in çok satırlı metin bileşenidir. Apple Developer belgelerine (2025) göre UITextView, etkileşim işleme için textViewDidChange, shouldInteractWithURL ve shouldInteractWithTextAttachment geri çağrılarıyla UITextViewDelegate sağlar. UITextField'ın aksine UITextView, kaydırma, typingAttributes aracılığıyla metin stilleri ve bağlantıları, adresleri ve tarihleri otomatik algılama için dataDetectorTypes'ı destekler. iOS uygulamalarında içerik görüntülemek ve çok satırlı metin girmek için ana bileşen budur.

Anahtar Noktalar

  • UITextView — UIKit'te çok satırlı metin alanı, düzenleme desteğiyle UIScrollView'in varisi
  • NSAttributedString — nitelikli metin desteği: yazı tipleri, renkler, satır aralığı, bağlantılar
  • UITextViewDelegate — textViewDidChange, shouldInteractWithURL, didBeginEditing aracılığıyla yönetim
  • Data Detector Types — metinde bağlantıların, adreslerin, tarihlerin, telefon numaralarının otomatik algılanması
  • Text Container — özel düzen için textContainer, exclusionPaths ve lineFragmentPadding sistemi

UITextView Nedir

UITextView, çok satırlı metni görüntülemek ve düzenlemek için tasarlanmış bir UIKit bileşenidir. UILabel'in aksine UITextView, metin seçimini, düzenlemeyi, içerik boyutu aştığında kaydırmayı ve nitelikli metni destekler. UIScrollView'in bir alt sınıfı olarak UITextView, içerik taştığında otomatik olarak dikey ve yatay kaydırma içerir — bu isScrollEnabled aracılığıyla yapılandırılır. Sınıf, isEditable özelliği aracılığıyla düzenlemeyi destekler: salt okunur mod için false olarak ayarlayın. UITextView, TextKit sistemi aracılığıyla NSLayoutManager ile çalışır: NSTextStorage (nitelikli metin depolama) → NSLayoutManager (satır düzeni) → NSTextContainer (metin alanı geometrisi). Bu mimari, görsel sarma, çok sütunlu metin ve karmaşık metin düzenleriyle özel düzenlere olanak tanır. UITextView, iOS'ta makaleleri, açıklamaları, günlükleri, yorumları ve herhangi bir çok satırlı metni görüntülemek için kullanılır.

UITextView vs UITextField: Temel Farklar

UITextView ve UITextField arasındaki fark satır sayısının çok ötesine geçer. UITextField, yer tutucu, sol/sağ görünüm ve temizleme düğmesi desteğiyle tek satırlı bir UIControl'dür. UITextView, nitelikli metin için eksiksiz bir TextKit sistemiyle çok satırlı bir UIScrollView'dür. UITextField, görüntüleme düzeyinde NSAttributedString'i desteklemez (yalnızca sınırlamalarla attributedText aracılığıyla), UITextView, farklı yazı tipleri, paragraf stilleri ve gömülü görsellerle NSAttributedString'i tam olarak işler. UITextField'da yerleşik bir temizleme düğmesi (clearButtonMode) bulunur, UITextView'da bulunmaz — özel bir uygulama gerekir. UITextField otomatik olarak içeriğe göre yeniden boyutlandırılır (intrinsicContentSize), UITextView, contentSize gözlemi veya Auto Layout kısıtlamaları aracılığıyla manuel yükseklik yönetimi gerektirir. UITextView, dataDetectorTypes'ı destekler, UITextField iOS 16+'dan itibaren destekler. Çok satırlı metin girişi (yorumlar, notlar, mesajlar) için UITextView'i seçin. Form alanları (ad, e-posta, şifre) için UITextField kullanın.

ÖzellikUITextViewUITextField
SatırlarÇok satırlıTek satırlı
Yer TutucuHayır (özel)Yerleşik
Metin NitelikleriTam NSAttributedStringSınırlı
Data DetectorsTam destekiOS 16+
Satır İçi GörsellerNSTextAttachment aracılığıylaDesteklenmez
KaydırmaYerleşik (UIScrollView)Hayır
Sol/Sağ GörünümHayırYerleşik

NSAttributedString ve Metin Biçimlendirme

NSAttributedString, UITextView'i UITextField ve UILabel'den ayıran temel bir yetenektir. Nitelikli bir dize, tek bir metin içinde farklı yazı tipleri, renkler, satır aralığı, hizalama ve bağlantılar ayarlamaya olanak tanır. Özellikler: textView.attributedText = attributedString. Temel NSAttributedString.Key nitelikleri: font (.systemFont, .boldSystemFont, özel UIFont), foregroundColor, backgroundColor, paragraphStyle (lineSpacing, alignment, lineBreakMode ile NSMutableParagraphStyle), link (etkileşimli bağlantılar için URL), underlineStyle, strikethroughStyle, shadow, baselineOffset, kern (harf aralığı). Bir attributedString oluşturmak için init(string:, attributes:) veya farklı aralıklara nitelik eklemek için NSMutableAttributedString kullanın. UITextView, bağlantıları (link niteliği) otomatik olarak etkileşimli olarak görüntüler — basıldığında temsilci yöntemi shouldInteractWithURL tetiklenir. Yeni giriş için nitelikleri sıfırlamak üzere typingAttributes kullanın.

swift
import UIKit

let textView = UITextView()
textView.isEditable = false
textView.isScrollEnabled = true
textView.dataDetectorTypes = [.link, .phoneNumber]

let attributedString = NSMutableAttributedString(
    string: "Visit our website or call +1-800-555-0199"
)
attributedString.addAttributes([
    .font: UIFont.systemFont(ofSize: 16),
    .foregroundColor: UIColor.label,
], range: NSRange(location: 0, length: 11))

let linkRange = (attributedString.string as NSString)
    .range(of: "website")
attributedString.addAttributes([
    .link: URL(string: "https://example.com")!,
    .foregroundColor: UIColor.systemBlue,
], range: linkRange)

textView.attributedText = attributedString

UITextViewDelegate ve Bağlantı İşleme

UITextViewDelegate, düzenlemeyi ve metinle etkileşimi yöneten bir protokoldür. Ana yöntemler: textViewDidBeginEditing(textView) — düzenleme başladığında çağrılır; textViewDidEndEditing — düzenleme bittiğinde; textViewDidChange — her metin değişikliğinde; textViewDidChangeSelection — seçim değiştiğinde; textViewShouldInteractWithURL — bir bağlantıya dokunulduğunda (Bool döndürür, geçişe izin verir); textViewShouldInteractWithTextAttachment — gömülü bir görsele dokunulduğunda. UITextView içindeki bağlantıları işlemek için shouldInteractWithURL'i geçersiz kılın — içinde: URL'yi SFSafariViewController'da açabilir, onay için UIAlertController gösterebilir, özel URL şemalarını işleyebilirsiniz. Önemli: textView.isEditable = true ise, bağlantılar tek dokunuşla kullanılamaz — çift dokunuş gerekir. Düzenlenebilir textView'da etkileşimli bağlantılar için hareket tanıyıcıları kullanın.

SFSafariViewController ile Bağlantı İşleme

SFSafariViewController, iOS uygulamalarında bağlantıları açmanın standart yoludur. shouldInteractWithURL yönteminde URL ile SFSafariViewController oluşturun ve bunu modal olarak veya navigationController aracılığıyla gösterin. Evrensel bağlantılar için UIApplication.shared.open(url, options) kullanın — ancak bu uygulamanın dışına çıkar. Bağlantı açılmasını önlemek için shouldInteractWithURL'de false döndürün ve URL'yi kendiniz işleyin.

Text Container Sistemi: Kenar Boşlukları ve Exclusion Paths

NSTextContainer, UITextView metninin görüntülendiği geometrik alanı tanımlayan TextKit mimarisinin bir parçasıdır. Her UITextView'in şu şekilde yapılandırılabilen standart bir textContainer'ı vardır: textView.textContainerInset — textView kenarlarından metin kenar boşlukları (UIEdgeInsets); textView.textContainer.lineFragmentPadding — her satırın içindeki yatay dolgu; textView.textContainer.maximumNumberOfLines — satır sınırı (0 = sınırsız); textView.textContainer.exclusionPaths — metnin etrafından dolaşması gereken alanlar (görseller, özel şekiller) için UIBezierPath dizisi. ExclusionPaths, karmaşık düzenlere olanak tanır: metin, dairesel bir profil resmi, simge veya herhangi bir rastgele şeklin etrafından dolaşır. Dinamik UITextView yüksekliği için KVO veya temsilci aracılığıyla contentSize'i gözlemleyin ve kısıtlamaları güncelleyin.

swift
// Dynamic UITextView height via contentSize
func textViewDidChange(textView: UITextView) {
    let fixedWidth = textView.frame.size.width
    let newSize = textView.sizeThatFits(
        CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude)
    )
    heightConstraint.constant = newSize.height
    UIView.animate(withDuration: 0.1) {
        self.view.layoutIfNeeded()
    }
}

// ExclusionPath for image wrapping
let imageFrame = CGRect(x: 16, y: 100, width: 80, height: 80)
let exclusionPath = UIBezierPath(rect: imageFrame)
textView.textContainer.exclusionPaths = [exclusionPath]

Data Detector Types: Otomatik Algılama

dataDetectorTypes, metindeki belirli veri türlerini otomatik olarak tanıyan ve etkileşimli hale getiren bir UITextView özelliğidir: .link (URL, e-posta), .phoneNumber (telefon numaraları), .address (adresler), .calendarEvent (tarihler ve etkinlikler), .flightNumber (uçuş numaraları), .lookupSuggestion (arama önerileri), .trackingNumber (takip numaraları), .money (tutarlar), .shipmentTrackingNumber, .all (tüm türler). Data Detector, NSDataDetector ve URL ile çalışır, algılanan verileri otomatik olarak vurgular. İşlemeyi özelleştirmek için dataDetectorTypes'ı ayarlayın ve temsilcide shouldInteractWithURL'i geçersiz kılın. Önemli: dataDetectorTypes, ek yapılandırma olmadan yalnızca URL ve phoneNumber için çalışır — diğer türler iOS 16+ gerektirebilir. Data Detector, NSAttributedString'deki link niteliğiyle çakışmaz — her iki mekanizma paralel olarak çalışır. İçerikle (haberler, makaleler) salt okunur UITextView için dataDetectorTypes = [.link, .phoneNumber] olarak ayarlayın.

  • .link — URL'ler, e-posta adresleri; mavi bağlantılar olarak görüntülenir
  • .phoneNumber — telefon numaraları; dokunma Çağrı eylemini gösterir
  • .address — posta adresleri; dokunma Maps'i açar
  • .calendarEvent — tarihler ve saatler; dokunma takvim etkinliği oluşturur
  • .flightNumber — uçuş numaraları (iOS 16+); hızlı uçuş kontrolü

UITextView ile Kod Örnekleri

iOS uygulamalarında UITextView kullanımına ilişkin iki pratik örneğe bakalım. Birincisi — içerik görüntülemek için nitelikli metin ve veri algılayıcılı salt okunur metin görünümü. İkincisi — yorum formu için tembel yer tutuculu ve dinamik yükseklikli düzenlenebilir metin görünümü. Her iki örnek de UIKit en iyi uygulamalarını kullanır: temsilci protokolü, Auto Layout ve TextKit.

İçerik ve Bağlantılarla Salt Okunur UITextView

Salt okunur mod, isEditable = false ve isSelectable = true ayarlanarak etkinleştirilir. Bu, kullanıcının metin seçmesine ve bağlantılara dokunmasına izin verir, ancak düzenlemeye izin vermez. Bağlantıların otomatik algılanması için dataDetectorTypes'ı ayarlayın, şeffaf arka plan için backgroundColor = .clear. Uzun içerik için okunabilirlik için NSMutableParagraphStyle lineSpacing ile attributedText kullanın. Metin içindeki anahtar bağlantılar için link nitelikleri ekleyin.

swift
import UIKit

class ArticleViewController: UIViewController {
    let contentView = UITextView()

    override func viewDidLoad() {
        super.viewDidLoad()
        contentView.isEditable = false
        contentView.isSelectable = true
        contentView.dataDetectorTypes = [.link, .phoneNumber]
        contentView.backgroundColor = .clear
        contentView.textContainerInset = UIEdgeInsets(
            top: 8, left: 16,
            bottom: 8, right: 16
        )
        contentView.delegate = self
        loadArticleContent()
    }

    func loadArticleContent() {
        guard let url = URL(string: "https://example.com/article")
        else { return }
        // Load content from URL and set attributedText
    }
}

Yer Tutuculu Düzenlenebilir UITextView

UITextView için Yer tutucu yerleşik değildir — textView üzerinde bir UILabel aracılığıyla veya isEmpty kontrolü ile attributedText aracılığıyla uygulayın. Basit bir yaklaşım: düzenleme başladığında gizlenen gri metinli bir UILabel. textViewDidChange'te metnin varlığını kontrol edin ve yer tutucuyu gizleyin/gösterin. Daha şık bir çözüm için giriş metni rengini ayarlamak üzere typingAttributes özelliğini kullanın. Dinamik textView yüksekliği, contentSize'in gözlemlenmesi ve kısıtlamaların güncellenmesiyle elde edilir — bu, sohbetler ve yorum formları için standart bir kalıptır.

Sıkça Sorulan Sorular

UITextView'e nasıl yer tutucu eklenir?

UITextView'in yerleşik bir yer tutucusu yoktur. Standart çözüm: textView'in üzerine gri metinli bir UILabel ekleyin. textViewDidBeginEditing'de etiketi gizleyin, textViewDidEndEditing'de metin boşsa gösterin. Alternatif olarak: yer tutucu olarak gri renkli attributedText kullanın ve düzenleme başladığında sıfırlayın. Hazır bir çözüm için KMPlaceholderTextView kitaplığını veya ReactorKit'i kullanın.

UITextView'de kenar boşlukları nasıl kaldırılır?

textContainerInset = .zero ve lineFragmentPadding = 0 olarak ayarlayın: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0. Ek olarak: textView.contentInset = .zero. Bu, textView kenarlarından metne kadar olan kenar boşluklarını tamamen kaldıracaktır. lineFragmentPadding'in varsayılan olarak 5 olduğunu unutmayın.

UITextView neden bağlantıları açmıyor?

Kontrol edin: isSelectable = true (etkileşim için gerekli), dataDetectorTypes .link içeriyor, temsilci shouldInteractWithURL'de false döndürmüyor. textView.isEditable = true ise, bağlantılar tek dokunuşla kullanılamaz — çift dokunuş gerekir. Düzenlenebilir textView'da etkileşimli bağlantılar için textView'in üzerine UITapGestureRecognizer ekleyin ve URL'leri manuel olarak işleyin.

Kaydırmalı sabit yükseklikte UITextView nasıl yapılır?

isScrollEnabled = true olarak ayarlayın ve sabit bir değerle yükseklik kısıtlaması ekleyin. Yüksekliği aşan metin kaydırılacaktır. Optimum KX için maxHeight kullanın: contentSize'i gözlemleyin ve yükseklik kısıtlamasını maxHeight'ten yüksek olmayacak şekilde ayarlayın. maxHeight aşıldığında scrollEnabled'i etkinleştirin. Bu, mesaj ve yorum giriş alanları için standart bir kalıptır.

UITextView'e nasıl görsel eklenir?

NSTextAttachment kullanın: bir nesne oluşturun, görseli ve bounds'u ayarlayın, ardından ekten bir NSAttributedString oluşturun ve textView.attributedText'e ekleyin. Örnek: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment). Görsel, metinde satır içi olarak görüntülenecek ve onunla birlikte kaydırılacaktır.

Özet

  • UITextView — UIKit'te çok satırlı metin bileşeni, TextKit desteğiyle UIScrollView'in varisi
  • NSAttributedString — yazı tiplerini, renkleri, bağlantıları ve paragrafları biçimlendirmek için anahtar yetenek
  • UITextViewDelegate — düzenleme yönetimi ve bağlantı ile ek dokunuşlarının işlenmesi
  • Data Detector Types — NSDataDetector aracılığıyla URL, telefon, adres ve tarihlerin otomatik algılanması
  • Text Container — düzen için exclusionPaths, lineFragmentPadding ve textContainerInset ile sistem
  • Yer tutucu — yerleşik değil, UILabel veya gri renkli attributedText aracılığıyla uygulanır
  • Dinamik yükseklik — otomatik yükseklik için contentSize gözlemi ve kısıtlama güncellemeleri
  • UITextView, çok satırlı, nitelik, kaydırma ve veri algılama desteğinde UITextField'den ayrılır

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun