2014-07-15 29 views
5

UITextFields için özel girdimle ilgili sorun yaşıyorum. Kullanıcının bir UITextField numaralı telefona girmesi gereken metne bağlı olarak, inputView sadece gerekli harfleri görüntüler. Bu kısa metinler için, sadece bir satır harf içeren bir giriş Görünümü yeterlidir, uzun metinler 2 veya 3 satır gerektirebilir, bu yüzden inputView'un yüksekliği değişkendir.Özel giriş iOS 8'de dinamik yüksekliğe sahip görünüm

Daha iyi performans beklediğimden beri, her textField tarafından kullanılan yalnızca bir inputView örneği var. Bu şekilde, yaratımın yalnızca bir kez gerçekleşmesi ve bazen girişe ihtiyaç duyulan doğrudan erişimi kolaylaştırması gerekir. InputView - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField'da kurulur, gerekli yüksekliğini ayarlar ve gösterilecektir.

Bu, mükemmel çalışıyor, ancak iOS8'de çalışmıyor. Orada inputView içeren bazı sistem görünümü değiştiklerinde inputView sınırına uyacak şekilde çerçevesini güncellemez (ilk kez çalışır).

Bu, textField başına benim inputView bir örneğini kullanarak sabit olabilir biliyorum. Ancak, çerçeveyi ayarlamanın veya değiştirmeyi içeren görünüme bildirmenin önerilen/daha iyi bir yolu olup olmadığını soruyorum. Belki de yayınlanana kadar giderilebilecek bir iOS8 hatası mı?

CustomInputView

@implementation CustomInputView 

+ (CustomInputView*)sharedInputView{ 
    static CustomInputView *sharedInstance; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[CustomInputView alloc] init]; 
    }); 
    return sharedInstance; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     self.backgroundColor = [UIColor greenColor]; 
    } 
    return self; 
} 

- (void)setupForTextField:(UITextField*)textField{ 
    CGFloat height; 

    if(textField.tag == 1){ 
     height = 100; 
    }else height = 50; 

    self.frame = CGRectMake(0, 0, 320, height); 
} 
@end 

TestViewController kodu

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(15, 50, 290, 30)]; 
    tf.text = @"bigKeyboard"; 
    tf.inputView = [CustomInputView sharedInputView]; 
    tf.layer.borderWidth = 1; 
    tf.layer.borderColor = [UIColor lightGrayColor].CGColor; 
    tf.delegate = self; 
    tf.tag = 1; 
    [self.view addSubview:tf]; 

    tf = [[UITextField alloc] initWithFrame:CGRectMake(15, 100, 290, 30)]; 
    tf.text = @"smallKeyboard"; 
    tf.inputView = [CustomInputView sharedInputView]; 
    tf.layer.borderWidth = 1; 
    tf.layer.borderColor = [UIColor lightGrayColor].CGColor; 
    tf.delegate = self; 
    tf.tag = 2; 
    [self.view addSubview:tf]; 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 
    [button setTitle:@"dismissKeyboard" forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(endEditing) forControlEvents:UIControlEventTouchUpInside]; 
    button.frame = CGRectMake(15, 150, 290, 30); 
    [self.view addSubview:button]; 
} 

- (void)endEditing{ 
    [self.view endEditing:YES]; 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 
    [[CustomInputView sharedInputView] setupForTextField:textField]; 
    return YES; 
} 
+0

Girdiyi yeniden boyutlandırmak için herhangi bir çözüm buldunuz mu? IPad için sabit giriş yüksekliği ihtiyacım var. –

+0

Sabit bir yüksekliğe ihtiyacınız varsa, çalışmalıdır - inputView, oluştururken belirttiğiniz yükseklikte kalır. Yüksekliği daha sonra değiştirmeniz gerekirse, hala bir çözümün farkında değilim. Benim durumum için tamam olan textView başına bir inputView yaratmanın geçici bir çözüm aldı ... – robert

cevap

12

Ben iOS 10'a iOS 8'den özel klavye boyutlandırma ile benzer sorunlar vardı:

İşte sorunu yeniden oluşturmak için bazı örnek kod. Doğru çözümün, giriş görünümünün uygun bir intrinsicContentSize sağlaması ve t değerini değiştirmek istediğinizde değeri değiştirmesi (ve geçersiz kılınması) olduğuna inanıyorum. O'nun yüksekliğini görüyor. Örnek kod: Ayrıca, https://stackoverflow.com/a/40359382/153354 numaralı telefona da bakın.

İlgili konular