2013-09-01 18 views
44

I napotkały coś nieco dziwne z contentInsetsUITextView zawartość wstawka

Mam UITextView w moich ujęć z contentInset 50 po lewej stronie, a ja staram się dodać jakieś dopełnienie do mojego UITextView

jednak , pasek przewijania pojawia się na dole uitextview, jak pokazano poniżej w tym teście: enter image description here

Miałem wrażenie, że contentInset zgniecie uitextview bez powodowania tego poziomego paska przewijania, więc jak mogę usunąć potrzebę poziomego paska przewijania? scrollbar i rób wszystko - wstawkę I cały tekst w uitextview - widoczny bez potrzeby korzystania z paska przewijania.

N.B: Nie pytam o zapobieganiu przewijanie w poziomie lub nie wyświetlanie paska przewijania (w ten sposób cięcia tekstu)

Dzięki wielkie!

Dla atomk (UITextView nazywa ss)

NSLog(@"Content Size Before %f",self.ss.contentSize.width); Logs: 280 
CGSize size=self.ss.contentSize; size.width=size.width-50; 
[self.ss setContentSize:size]; 
NSLog(@"Content Size After %f",self.ss.contentSize.width); Logs: 230 

Jest nr widoczna różnica pomiędzy widokiem z kodem dodanej niż zanim został dodany, więc coś się dzieje nie tak! (Dzięki)

Odpowiedz

63

UPDATE: To rozwiązanie jest nieaktualna jak iOS 7.

Zobacz this answer below. W iOS 7,0 właściwość textContainerInset na UITextView wprowadzono:

textView.textContainerInset = UIEdgeInsetsMake(0, 50, 0, 0); 

Wstępnie iOS 7 rozwiązanie:

że wrażenie, że kabaczki contentInset UITextView bez powodowania ta pozioma pasek przewijania ...

Obawiam się, że tak nie jest contentInset współpracuje z UITextView. Zobacz Apple's documentation dla contentInset gdzie stwierdza:

odległości, że widok treść jest wstawka z otaczającej przewijania widoku ... Za pomocą tej właściwości można dodać do obszaru wokół przewijania zawartości.

contentInset jest dodano wokół zawartości.


Można zmienić contentSize w viewDidLayoutSubviews używając kodu zostały uwzględnione powyżej:

- (void)viewDidLayoutSubviews 
{ 
    self.textView.contentInset = UIEdgeInsetsMake(0, 50, 0, 0); 

    NSLog(@"Content Size Before %f",self.textView.contentSize.width); //Logs: 280 
    CGSize size=self.textView.contentSize; 
    size.width=size.width-50; 
    [self.textView setContentSize:size]; 
    NSLog(@"Content Size After %f",self.textView.contentSize.width); //Logs: 230 
} 

to jednak powoduje, że tekst, który ma zostać odcięty po prawej stronie:

UITextView cut off on right side


Najlepszy sposób, w jaki zostałem abl e, aby uzyskać wygląd poziomej wyściółki w UITextView, należy umieścić ją wewnątrz pojemnika UIView. W takim przypadku wystarczy utworzyć taki sam rozmiar, jaki ma bieżący widok tekstowy, i dodać widok tekstowy, który jest węższy o 50 pikseli w widoku kontenera.

To obejście może powodować problemy, jeśli masz tło do widoku tekstu, ale z powyższego zrzutu ekranu nie wygląda na to, że jest to problem dla Ciebie.

UITextView (ramka w kolorze czerwonym) wewnątrz UIView pojemniku:

UITextView inside container UIView

Jeśli Twój UITextView ma tła, patrz:

Mam nadzieję, że pomoże, a jeśli ktoś znajdzie lepsze rozwiązanie, chciałbym o tym usłyszeć!

+1

Rzucił okiem na twój kod GitHub. To wygląda wspaniale; naprawdę czysty styl i dużo uwagi. –

160

W systemie iOS 7 UITextView jest oparty na TextKit i ma nową właściwość textContainerInset. Zachowuje się tak, jak można się spodziewać:

UITextView *textView = ...; 
// Left inset of 50 points 
textView.textContainerInset = UIEdgeInsetsMake(0.0, 50.0, 0.0, 0.0); 
+3

to działa jak zaklęcie, nie wiem, dlaczego nie jest na górze :) –

+2

To powinna być teraz akceptowana odpowiedź! – simme

+3

tak, to powinna być zaakceptowana odpowiedź. – zic10