Çok satırlı bir UITextfield nasıl oluşturulur?


259

Kullanıcının bazı bilgileri yazmak zorunda olduğu bir uygulama geliştiriyorum. Bu amaçla UITextFieldçok satırlı (genel UITextFieldolarak tek bir satır) ihtiyacım var.

Ben Googling olduğum için bu amaç UITextViewyerine kullanmak için bir cevap buluyorum UITextfield.


İşte tam olarak bu amaçla yazdığım küçük kontrol. çok hatlı bir destek ve klavyeyi kapatmak için Bitti düğmesine sahiptir. kullanmaktan çekinmeyin code.google.com/p/galtextfield
Gal Blank

2
Bu üçüncü taraf sınıfları kullanın xcode projenizi içe aktarın ve kullanın, çok iyi çalışıyor bağlantı: github.com/adonoho/HPGrowingTextView
mahesh chowdary

Yanıtlar:


435

UITextField yalnızca tek satırlıktır.

Google aramanız doğru, çok satırlı metnin görüntülenmesi ve düzenlenmesi UITextViewyerine kullanmanız gerekiyor UITextField.

Interface Builder'da, UITextViewistediğiniz bir yere ekleyin ve "düzenlenebilir" kutusunu seçin. Varsayılan olarak çok satırlı olacaktır.


7
Yerli Takvim uygulamasının etkinlik ekleme ekranındaki notlar için yer tutucu ve kelime kaydırmayla nasıl Görünüm oluşturduğunu lütfen söyle?
Gennadiy Ryabkin

3
UITextView için yer tutucu nasıl ayarlanır?
Mani

4
TextView'a yer tutucu ekleyemezsiniz, ancak TextView üzerine gri bir etiket ekleyebilir ve kullanıcı bir metin girerse gizleyebilirsiniz.
Andrew Romanov

Lütfen kimse bana aşağıdaki soru ile yardımcı olabilir mi? Kullanıcı UITextView'da madde işaretli metin (birden çok satır sonu) yazarsa, toplam satır sonu sayısı nasıl algılanır?
Markus

@Markus bunun için yeni bir soru açmalısın
Nathan F.

20

UITextView kullanarak bir UITextField taklit edebilirsiniz. Sorun, yer tutucu işlevini kaybetmenizdir.

Bir UITextView kullanmayı seçerseniz ve yer tutucusuna ihtiyacınız varsa bunu yapın:

ViewDidLoad, rengi ve metni yer tutuculara ayarlar:

myTxtView.textColor = .lightGray
myTxtView.text = "Type your thoughts here..."

Ardından, UITextView öğeniz seçildiğinde yer tutucunun kaybolmasını sağlayın:

func textViewDidBeginEditing (textView: UITextView) {
    if myTxtView.textColor.textColor == ph_TextColor && myTxtView.isFirstResponder() {
        myTxtView.text = nil
        myTxtView.textColor = .white
    }
}

Kullanıcı düzenlemeyi bitirdiğinde bir değer olduğundan emin olun. Yoksa, yer tutucuyu tekrar ekleyin:

func textViewDidEndEditing (textView: UITextView) {
    if myTxtView.text.isEmpty || myTxtView.text == "" {
        myTxtView.textColor = .lightGray
        myTxtView.text = "Type your thoughts here..."
    }
}

Sahte olmanız gerekebilecek diğer özellikler:

UITextField genellikle her harfi büyük harfe çevirir, bu özelliği UITableView'a ekleyebilirsiniz:

myTxtView.autocapitalizationType = .words

UITextField genellikle kaydırma yapmaz:

myTxtView.scrollEnabled = false

18

Tamam bazı hile ile yaptım;) İlk önce bir inşa UITextFieldve artırın şöyle size:

CGRect frameRect = textField.frame;
        frameRect.size.height = 53;
        textField.frame = frameRect;

Sonra UITextViewu aynı benim yaptığım aynı alanda inşa UITextFieldve onun sildi background color. Şimdi u birden fazla satır var gibi görünüyor TextField!


2
Otomatik düzen kullandım ve UITextField öğesinin tüm kenarlarını UITextView'e sabitledim. Gerçekten harika numara, teşekkürler!
phatmann

lütfen @phantmann, bize otomatik düzen için kodunuzu gösterebilir misiniz?
Esteve

8
Bu bir a oluşturur UITextView. Bir UITextField'a sahip olmanın amacı, a'dan farklı davranmasıdır UITextView.
Nate Symer

2
Arasındaki farkların bir grup vardır UITextViewve UITextfield: Devralacak UIScrollViewvs UIControl-düzenlenemez-by-varsayılan olarak-varsayılan düzenlenebilir-vs, satırlı vs tek hat, farklı temsilci protokolleri, no-tutucu vs tutucudur.
Sam Ballantyne

UITextViewmetin paragrafları içindir. Metin paragrafına ihtiyacınız varsa kullanın, aksi halde kullanmayın.
Sam Ballantyne

9

Çok satırlı davranışın yanı sıra, UITextView ve UITextField arasındaki temel fark UITextView bir yer tutucu önermemesidir. Bu sınırlamayı atlamak için, "sahte yer tutuculu" bir UITextView kullanabilirsiniz.

Ayrıntılar için şu SO sorusuna bakın: UITextView içinde yer tutucu .


2

2 satır metin içeren bir UITextField öğeniz olması gerekiyorsa, seçeneklerden biri metnin ikinci satırı için UITextField öğesinin alt görünümü olarak bir UILabel eklemektir. Benim app UITextField sık sık farkında değilim ki dokunarak düzenlenebilir olduğunu UITextField var ve ben UITextField için "Düzenle için dokunun" yazan bazı küçük altyazı metni eklemek istedim.

CGFloat tapLlblHeight = 10;
UILabel *tapEditLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, textField.frame.size.height - tapLlblHeight - 2, 70, tapLlblHeight)];
tapEditLbl.backgroundColor = [UIColor clearColor];
tapEditLbl.textColor = [UIColor whiteColor];
tapEditLbl.text = @"Tap to Edit";

[textField addSubview:tapEditLbl];

2

Evet, aradığınız şey UITextView. Bazı şeylerle farklı şekilde uğraşmanız gerekir (dönüş tuşu gibi), ancak buna metin ekleyebilir ve içeride çok fazla metin varsa yukarı ve aşağı kaydırmanıza izin verir.

Bu bağlantı, veri girmek için ekran oluşturma hakkında bilgi içerir:

veri giriş ekranı oluşturma



0

Yukarıdaki h4xxr'ın cevabına ek olarak, UITextField'in yüksekliğini ayarlamanın daha kolay bir yolu, denetçiler -> Metin Alanı özelliklerinde kare kenarlık stilini seçmektir. (Varsayılan olarak, bir UITextfield öğesinin kenarlık stili elips şeklindedir.)

Referans: Buraya Brian yanıtladı: UITextField yüksekliği nasıl ayarlanır?


-1

Benim için çalışan başka bir seçenek daha var:

UITextField alt sınıfı ve üzerine yazma:

- (void)drawTextInRect:(CGRect)rect

Bu yöntemde şunları yapabilirsiniz:

    NSDictionary *attributes = @{ NSFontAttributeName : self.font,
                                  NSForegroundColorAttributeName : self.textColor };

    [self.text drawInRect:verticalAlignedRect withAttributes:attributes];

Bu kod, eğer rekt yeterli alana sahipse metni gerektiği kadar satır kullanarak oluşturur. İhtiyaçlarınıza bağlı olarak başka bir özellik belirtebilirsiniz.

Kullanmayın:

self.defaultTextAttributes

bir satır metin oluşturmaya zorlar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.