2012-08-03 13 views
9

po dodaniu właściwy pogląd na UITextField, jestem stwierdzając, że odmawia wyświetlać zarówno właściwy pogląd i wyraźny przycisk (posiadającą zarówno rightViewMode i clearButtonMode zestaw do UITextFieldViewModeAlways). Widzę właściwy widok, ale wyraźny przycisk nie jest już wyświetlany. Upewniłem się, że nie nakładają się one przez overriden clearButtonRectForBounds i clearButtonRectForBounds, bezskutecznie. A jeśli używam lewostronnego zamiast prawego widoku, to nie ma takiego problemu i wyświetlają się zarówno lewy widok, jak i przycisk "wyczyść".Wyświetlanie zarówno właściwy pogląd i wyraźny przycisk w UITextField

Chociaż nie wydaje się, że jest to stwierdzone w dokumentacji, wygląda na to, że przycisk "wyczyść" jest wyświetlany tylko wtedy, gdy prawy widok nie jest wyświetlany (i gdy właściwość tekstu nie jest pustym ciągiem znaków). Czy to jest poprawne i czy ktoś ma niezawodne obejście? W międzyczasie wierzę, że utknąłem z koniecznością stworzenia UIView, który nakłada mój prawidłowy widok na UITextField, aby uzyskać to, co sam dostanę z samego UITextField.

Odpowiedz

3

Tak, masz rację. UITextfield ma właściwości takie jak widok z lewej i prawej strony. Jeśli użyjesz przycisku clear, nakłada się on na prawy.

Formularz Jabłko doc http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextField_Class/Reference/UITextField.html

Jeśli widok nakładki nie nakładają żadnych innych widoków rodzeństwo, odbiera zdarzenia dotykowe jak każdego innego widoku. Jeśli określisz kontrolkę dla swojego widoku, ta kontrolka śledzi i wysyła akcje w zwykły sposób. Jeśli widok nakładki pokrywa się z przyciskiem kasowania, przycisk kasowania ma zawsze pierwszeństwo przed odbieraniem zdarzeń. Domyślnie prawy widok nakładki pokrywa się z przyciskiem usuwania.

Ale jak sama nazwa mówi, jest to widok. Możesz więc utworzyć własny widok, który ma 2 przyciski i ustawić prawy widok pola tekstowego. Jeśli chcesz, możesz użyć trybów delegatów w polu tekstowym, aby przyciski pojawiały się i znikały z widoku.

+0

Dokumentacja wydaje się wprowadzać w błąd. Nie mówi, że wyraźny przycisk i prawy widok wzajemnie się wykluczają. Mówi tylko, że się nakładają. To sprawia, że ​​wydaje mi się, że gdybym użył przezroczystego widoku, zobaczyłbym wyraźny przycisk. Tak jednak nie jest. – Kento

13

nie można wyświetlać zarówno w tym samym czasie, ale można to zrobić jak ten

UITextField * textfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 300, 40)]; 

[textfield setBorderStyle:UITextBorderStyleRoundedRect]; 

UIImageView * imgvw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.jpeg"]]; 

[imgvw setFrame:CGRectMake(0, 0, 30, 30)]; 

[textfield setRightView:imgvw]; 

[textfield setRightViewMode:UITextFieldViewModeUnlessEditing]; 

[textfield setClearButtonMode:UITextFieldViewModeWhileEditing]; 

[self.view addSubview:textfield]; 
+0

Wspaniała odpowiedź! –

3

miałem ten sam problem, ale było łatwo rozwiązać poprzez „oszukiwanie” na UITextField w użyciu LeftView zamiast Widok z prawej. W ten sposób możesz użyć zarówno przycisku usuwania, jak i domniemanego rightView. Wszystko, co musisz zrobić, to podklasa UITextField i zwrócić "prawy róg" w leftViewRectForBounds i podobnie zaktualizować editingRectForBounds i textRectForBounds. Działa świetnie.

+0

Ułatwiłem po prostu dodać wyskakujące i zastąpić 'editingRectForBounds/textRectForBounds', aby tego uniknąć. Nie trzeba używać 'leftView' (ponieważ zawsze chcę, aby mój podgląd był wyświetlany.) – zekel

+1

Jeśli chcesz dodać przykładowy kod, dam ci awans :) – Tim

+0

Działa dobrze, ale musiałem również przesłonić 'placeholderRectForBounds', aby działało poprawnie. – execv

2

będę kopię zapasową odpowiedź @strange „s (przy użyciu widoku zamiast lewy prawy) z kodem:

-(CGRect)leftViewRectForBounds:(CGRect)bounds 
{ 
    return CGRectOffset([super leftViewRectForBounds:bounds], bounds.size.width - 30, 0); 
} 

-(CGRect)clearButtonRectForBounds:(CGRect)bounds 
{ 
    return CGRectOffset([super clearButtonRectForBounds:bounds], -30, 0); 
} 


-(CGRect)editingRectForBounds:(CGRect)bounds 
{ 
    CGRect rect = bounds; 
    rect.origin.x = 10; 
    rect.size.width -= 60; 
    return rect; 
} 


-(CGRect)textRectForBounds:(CGRect)bounds 
{ 
    CGRect rect = bounds; 
    rect.origin.x = 10; 
    rect.size.width -= 60; 
    return rect; 
} 

Uwaga że moje prawo (w lewo) Widok szerokość wynosi 30.

Jeśli zdarza się, że używasz zarówno lewego, jak i prawego widoku i przycisku kasowania, wtedy to rozwiązanie oczywiście nie zadziała. W takim przypadku będziesz musiał zrezygnować z używania jednego z nich i użyć osobnego widoku umieszczonego obok twojego UITextField.

Powiązane problemy