2010-01-08 29 views
6

Birkaç gün boyunca bunu araştırıyorum ve küçük bir yardım için minnettarım. SMS uygulamasında Apple kullanımı gibi çok satırlı bir UITextField oluşturmak için herhangi bir yolu var mı? Bu kontrol ile ilgili yararlı olan şey, bir metin giriş kutusu olduğunu açıkça ortaya koyan 'batık' bir görünüme sahip olmasıdır, ancak aynı zamanda, her yeni çizgi karakteri üzerinde genişler.Çok satırlı TextField (SMS'ye benzer) ve/veya 'Bitti' düğmesindeki UITextView

Bir UITextView kullanmak zorunda kaldığımda, klavyeyi en iyi nasıl atacağınız konusunda tavsiyede bulunabilir mi? 'Bitti' ve 'Git' düğmelerinin her ikisi de yeni satır karakterleri ('\ n') oluşturmak için görünür. Bu benim için yanlış görünüyor - kesinlikle bunlardan en az biri farklı bir karakter oluşturmalı, böylece hala yeni satır karakterlerine izin verebilirim, ancak klavyemi belirli bir tuşa basmadan da reddediyorum.

Burada basit bir şey mi eksik? peşin

Teşekkür :)

cevap

2

Facebook bir çok satırlı metin alanı vardır Three20 adlı açık kaynak paketi yayımladı. Genişleyen bir metin alanı için bunu kolayca kullanabilirsiniz.

"Bitti" düğmesiyle ilgili olarak, görüntü denetleyicinizi UITextFieldDelegate olarak ayarlayabilirsiniz. Sonra bu yöntemi kullanmak: Three20 durumunda

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    // Do whatever you want for your done button 
     return YES; 
} 

, TTTextEditorDelegate bu yöntemi kullanın:

- (BOOL)textFieldShouldReturn:(TTTextEditor *)textField { 
    // Do whatever you want for your done button 
     return YES; 
} 
+0

Merhaba ... UITextView, UITextViewDelegate olarak ayarlanmış bile textViewShouldReturn yöntemi yoktur. Ayrıca, Three20'nin kullandığı özel API'lerden dolayı uygulama deposundan reddedilen birden çok uygulamanın raporlarını okuduğum için Üç20 öğelerini kullanmaktan da çok memnunum. – Anonymouslemming

+2

Özel API başvuruları uzun zamandır Three20'den kaldırılmıştır (17 Kasım 2009'dan itibaren değişiklik listesine bakın). Geçtiğimiz Aralık ayında, iPhone Tech Talk Dünya Turu'nda bana açıklandığı gibi, kullanmamanız gereken herhangi bir kod, yine de sürüm sürümlerinden çıkarıldı. Xcode Yapı Sistemi Kılavuzunda (iPhone OS Referans Kitaplığı'nın bir parçası) "Ölü Kod Sıyırma" konusuna bakın. –

1

Peki, ben de benzer bir sorun vardı ve aslında bir engelli oluşturmak kullanılarak sona erdi neler Arka plan olarak UITextField ve girişi almak için yukarıdaki UITextView ... Bu iPhone API'sının varsayılan olarak bunu yapamayacağı berbat.

- (void)textViewDidChange:(UITextView *)inTextView { 
    NSString *text = inTextView.text; 

    if ([text length] > 0 && [text characterAtIndex:[text length] -1] == '\n') { 
     inTextView.text = [text substringToIndex:[text length] -1]; // remove last return from text view 
     [inTextView resignFirstResponder]; // hide keyboard 
    } 
} 
+0

UITextViewDelegate hakkındaki tavsiyeleriniz için teşekkürler, ancak bu işe yaramaz korkuyorum. Çok satırlı girdiye izin vermek istediğim için, '\ n' için tarama yapamıyorum - bu yüzden 'Go' ve 'Done' davranışlarının her ikisini de üretmenin yararsız olduğunu düşünüyorum. – Anonymouslemming

+0

Önerilen çözüm (bir tane de kullanıyorum), bir "UINavigationBar" için "UINavigationItem" 'rightBarButtonItem' olarak bir "Done" düğmesi eklemek olacaktır ve tıklandığında, sadece 'resignFirstResponder'; Metin görünümü. Veya temel olarak, yanıtlayandan istifa etmek için UI'nin başka herhangi bir öğesini ekleyin. Navigasyon çubuğu da yaygın olarak kullanılıyor. –

0
    : Ayrıca, UITextViewDelegate itibaren aşağıdaki yöntemi uygulamayı deneyin dönüş anahtarını ele gelince textViewDidChange:

    ele alarak istiyorsanız bu otomatik olarak genişleyen değildir, ancak bunu unutmayın

  • (boşluk) textEditorDidBeginEditing: (TTTextEditor *) texteditor { Ve

    • (boşluk) textEditorDidEndEditing: (TTTextEditor *) texteditor { , aradığınız şey olabilir. Keyfini çıkarın!
3

Eski soruya, ancak birkaç saat sonra ben mükemmel Instagram gibi bunu aynı yapmak nasıl düşündüm

(hepsi BTW arasında en iyi algoritma vardır) bununla

başlatma:

// Input 
    _inputBackgroundView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, size.height - _InputBarHeight, size.width, _InputBarHeight)]; 
    _inputBackgroundView.autoresizingMask = UIViewAutoresizingNone; 
    _inputBackgroundView.contentMode = UIViewContentModeScaleToFill; 
    _inputBackgroundView.userInteractionEnabled = YES; 
    [self addSubview:_inputBackgroundView]; 
    [_inputBackgroundView release]; 

    [_inputBackgroundView setImage:[[UIImage imageNamed:@"Footer_BG.png"] stretchableImageWithLeftCapWidth:80 topCapHeight:25]]; 

    // Text field 
    _textField = [[UITextView alloc] initWithFrame:CGRectMake(70.0f, 0, 185, 0)]; 
    _textField.backgroundColor = [UIColor clearColor]; 
    _textField.delegate = self; 
    _textField.contentInset = UIEdgeInsetsMake(-4, -2, -4, 0); 
    _textField.showsVerticalScrollIndicator = NO; 
    _textField.showsHorizontalScrollIndicator = NO; 
    _textField.font = [UIFont systemFontOfSize:15.0f]; 
    [_inputBackgroundView addSubview:_textField]; 
    [_textField release]; 

    [self adjustTextInputHeightForText:@""]; 

Dolgu UITextView temsilci yöntemleri:

- (void) textViewDidBeginEditing:(UITextView*)textView { 

    [self adjustTextInputHeightForText:_textField.text]; 
} 

- (void) textViewDidEndEditing:(UITextView*)textView { 

    [self adjustTextInputHeightForText:_textField.text]; 
} 

- (BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text { 

    if ([text isEqualToString:@"\n"]) 
    { 
     [self performSelector:@selector(inputComplete:) withObject:nil afterDelay:.1]; 
     return NO; 
    } 
    else if (text.length > 0) 
    { 
     [self adjustTextInputHeightForText:[NSString stringWithFormat:@"%@%@", _textField.text, text]]; 
    } 
    return YES; 
} 

- (void) textViewDidChange:(UITextView*)textView { 

    [self adjustTextInputHeightForText:_textField.text]; 
} 

Ve hile ...Bu işe yaramazsa, böylece

- (void) adjustTextInputHeightForText:(NSString*)text { 

    int h1 = [text sizeWithFont:_textField.font].height; 
    int h2 = [text sizeWithFont:_textField.font constrainedToSize:CGSizeMake(_textField.frame.size.width - 16, 170.0f) lineBreakMode:UILineBreakModeWordWrap].height; 

    [UIView animateWithDuration:.1f animations:^ 
    { 
     if (h2 == h1) 
     { 
     _inputBackgroundView.frame = CGRectMake(0.0f, self.frame.size.height - _InputBarHeight, self.frame.size.width, _InputBarHeight); 
     } 
     else 
     { 
     CGSize size = CGSizeMake(_textField.frame.size.width, h2 + 24); 
     _inputBackgroundView.frame = CGRectMake(0.0f, self.frame.size.height - size.height, self.frame.size.width, size.height); 
     } 
     CGRect r = _textField.frame; 
     r.origin.y = 12; 
     r.size.height = _inputBackgroundView.frame.size.height - 18; 
     _textField.frame = r; 

    } completion:^(BOOL finished) 
    { 
     // 
    }]; 
} 
+0

Merhaba, şu anda kodunuz derlenmiyor (ör. _InputBarHeight, Footer_BG.png resim, vb.). Kodunuzla en az bir proje oluşturabilir ve buraya indirmek için herkesin ihtiyacı olan bir bağlantıyı gönderebilirseniz (github belki?) Bana inandığım bir sürü insan için çok teşekkür ederim :) – ozba

+1

:) Bu örnekle git repo'yu oluşturdum https://github.com/alekperov/ChatInputSample – faviomob

+0

Teşekkürler! ASAP deneyeceğim :) – ozba