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, ç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 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.
| Özellik | UITextView | UITextField |
|---|---|---|
| Satırlar | Çok satırlı | Tek satırlı |
| Yer Tutucu | Hayır (özel) | Yerleşik |
| Metin Nitelikleri | Tam NSAttributedString | Sınırlı |
| Data Detectors | Tam destek | iOS 16+ |
| Satır İçi Görseller | NSTextAttachment aracılığıyla | Desteklenmez |
| Kaydırma | Yerleşik (UIScrollView) | Hayır |
| Sol/Sağ Görünüm | Hayır | Yerleşik |
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.
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, 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, 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.
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.
// 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]
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.
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.
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.
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
}
}
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'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.
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.
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.
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.
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
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.
Ayrıca okuyun