2010-09-08 13 views
43

Tworzę UITextField programowo i umieszczając go wewnątrz UIView. Rozmiar czcionki jest ustawiony na 15.0f (czcionka systemowa). Ale pojawiający się symbol zastępczy nie jest wyśrodkowany w widoku tekstowym. Ktoś wie, jak rozwiązać ten problem?Tekst zastępczy nie wyśrodkowany dla UITextField utworzonego programowo

Znalazłem kilka odniesień na SO dla niewyraźnego tekstu itp. I próbowałem ustawić ramkę pola tekstowego z wartościami całkowitymi, ale to nie robi różnicy.

UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(5.0f, 6.0f, 278.0f, 32.0f)]; 
[txtField setPlaceholder:@"My placeholder"]; 
[txtField setFont:[UIFont systemFontOfSize:15.0]]; 
[txtField setBorderStyle:UITextBorderStyleRoundedRect]; 
[txtField setAutocorrectionType:UITextAutocorrectionTypeNo]; 
[txtField setAutocapitalizationType:UITextAutocapitalizationTypeNone]; 
[txtField setKeyboardType:UIKeyboardTypeEmailAddress]; 
[txtField setReturnKeyType:UIReturnKeyDone]; 
[txtField setClearButtonMode:UITextFieldViewModeWhileEditing]; 

Dziękuję za wszelką pomoc

Uwaga: To znaczy, że tekst nie jest wyśrodkowany w pionie w polu tekstowym (jest nieco ku górze). Zatem ustawienie wyrównania tekstu nie jest rozwiązaniem.

Dodawanie obrazu problemu do wyjaśnienia - jak widać na obrazku, tekst zastępczy jest bardziej na górze, a nie w środku w pionie. alt text

+0

+1 Dzięki Zapytanie pomógł mi .. –

Odpowiedz

56

Trzeba dodać:

txtField.textAlignment = NSTextAlignmentCenter; // Pre-iOS6 SDK: UITextAlignmentCenter 

Pamiętaj, to reguluje zarówno wyrównanie tekstu zastępczego, jak również tekstem użytkownik wejdzie w

Jak Center. pionowo

Ponieważ pierwotne pytanie zostało zaktualizowane, aby poprosić o pionowe wyrównanie tekstu zastępczego, a ta odpowiedź jest ukryta w komentarzach, jak to zrobić:

txtField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
+1

Sorry o tym. Wydaje mi się, że to pytanie było trochę błędne. Miałem na myśli, że tekst nie jest wyśrodkowany w pionie. Zaktualizowano pytanie. – lostInTransit

+1

Następnie połącz nas ze zrzutem ekranu, abyśmy mogli dokładnie zobaczyć, o czym mówisz. Nigdy tego nie widziałem i zrobiłem to całkiem sporo. – jer

+1

Dodano również obraz. Daj mi znać, jeśli to pomoże w wskazaniu problemu. Nie jestem pewien, co mogę zrobić źle. Metoda tworzenia pola tekstowego jest dość prosta! – lostInTransit

18

To nie działa zgodnie z oczekiwaniami na iOS7. Na iOS7 trzeba będzie zastąpić klasę TextField i

- (void) drawPlaceholderInRect:(CGRect)rect 

metody.

Jak to:

- (void) drawPlaceholderInRect:(CGRect)rect 
{ 
    [[UIColor blueColor] setFill]; 
    CGRect placeholderRect = CGRectMake(rect.origin.x, (rect.size.height- self.font.pointSize)/2, rect.size.width, self.font.pointSize); 
    [[self placeholder] drawInRect:placeholderRect withFont:self.font lineBreakMode:NSLineBreakByWordWrapping alignment:self.textAlignment]; 
} 

działa zarówno iOS7 i wcześniejszych wersjach.

+7

Korzystanie z lineHeight zamiast pointSize daje lepszy wynik w mojej opinii. –

2

Użyłem właśnie tego koloru, ale musimy również ustawić czcionkę.

Ten pracował dla mnie:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes: 
@{ 
    NSForegroundColorAttributeName:[UIColor whiteColor], 
    NSFontAttributeName: [UIFont systemFontOfSize:12] 
}]; 
+0

To powinna być zaakceptowana odpowiedź. Nie wiem, dlaczego, jeśli nie ustawiłeś atrybutu czcionki, symbol zastępczy będzie źle wyrównany. Może dlatego, że czcionka zastępcza i czcionka tekstowa nie są takie same. 'contentVerticalAlignment' nie działa (przynajmniej dla mnie). – kientux

+0

To nie działa, jeśli używasz większego domyślnego rozmiaru czcionki niż symbol zastępczy. – mattsson

0

Zmiana minimalnej wysokości linii przy użyciu NSParagraphStyle był jedynym rozwiązaniem, które pracowały dla mnie:

NSMutableParagraphStyle *style = [self.addressBar.defaultTextAttributes[NSParagraphStyleAttributeName] mutableCopy]; 
style.minimumLineHeight = self.addressBar.font.lineHeight - (self.addressBar.font.lineHeight - placeholderFont.lineHeight)/2.0; 

self.addressBar.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Placeholder text" attributes:@{ 
    NSForegroundColorAttributeName: [UIColor colorWithRed:79/255.0f green:79/255.0f blue:79/255.0f alpha:0.5f], 
    NSFontAttributeName : placeholderFont, 
    NSParagraphStyleAttributeName : style 
}]; 
Powiązane problemy