2013-10-19 15 views
26

Com'è possibile che il mio modificabile UITextView (posta all'interno di un UIViewController semplice all'interno di una UISplitView che agisce come delegato per l'UITextView) non mostra il testo all'inizio ma dopo qualcosa come 6-7 linee?iOS 7 UITextView allineamento verticale

Screenshot

non ho impostato un particolare layout automatico o qualcosa di simile, cercando di eliminare il testo non aiuta (quindi niente caratteri nascosti o qualcosa del genere).

Sto usando iOS 7 su iPad, nello storyboard sembra buono ... Il problema è lo stesso su simulatore iOS e dispositivi reali. Mi sto arrabbiando: P

Ecco un po 'di codice. Questo è il ViewController viewDidLoad()

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.itemTextField.delegate = self; 
    self.itemTextField.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil); 
    self.itemTextField.textColor = [UIColor lightGrayColor]; //optional 
} 

e qui ci sono le funzioni override per la UITextView sto usando un certo codice che ho trovato su StackOverflow per simulare un segnaposto per la vista (le stesse cose sulla versione per iPhone del storyboard funziona bene) ...

// UITextView placeholder 
- (void)textViewDidBeginEditing:(UITextView *)textView 
{ 
    if ([textView.text isEqualToString:NSLocalizedString(@"NEWITEMPLACEHOLDER", nil)]) { 
     textView.text = @""; 
     textView.textColor = [UIColor blackColor]; //optional 
    } 
    [textView becomeFirstResponder]; 
} 

- (void)textViewDidEndEditing:(UITextView *)textView 
{ 
    if ([textView.text isEqualToString:@""]) { 
     textView.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil); 
     textView.textColor = [UIColor lightGrayColor]; //optional 
    } 
    [textView resignFirstResponder]; 
} 

-(void)textViewDidChange:(UITextView *)textView 
{ 
    int len = textView.text.length; 
    charCount.text = [NSString stringWithFormat:@"%@: %i", NSLocalizedString(@"CHARCOUNT", nil),len]; 
} 

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{ 
    return YES; 
} 
+0

l'azzurro è il colore di sfondo UITextView? –

+0

Sì, l'ho impostato nello storyboard per renderlo chiaro nello screenshot. A proposito, il problema esiste anche con il colore di sfondo predefinito. – Napolux

+0

Questo è stato pesantemente modificato dalla domanda originale, che era 'Come posso allineare verticalmente un UITextView'. –

risposta

33

tenta di chiamare -sizeToFit dopo aver superato il testo. Questa risposta potrebbe essere utile a Vertically align text within a UILabel.
[UPDATE]
Aggiornamento questa risposta o renderla più leggibile.
Il problema è che da iOS7, i controller di visualizzazione contenitore come UINavigationController o UITabbarController possono modificare gli insiemi di contenuto delle viste di scorrimento (o le viste che ne ereditano), per evitare la sovrapposizione di contenuto. Questo succede solo se la scrollview è la vista principale o le prime sottoview. Per evitare che si debba disabilitare questo comportamento impostando automaticallyAdjustsScrollViewInsets su NO, o sovrascrivendo questo metodo per restituire NO.

+0

Non funziona. Il 'UITextView' è ridimensionato a qualcosa come 30 x 20 pixel e non viene mostrato alcun testo. – Napolux

+0

Stai usando una stringa attribuita? – Andrea

+0

Testo normale. Permettetemi di aggiungere del codice alla domanda. :) – Napolux

0

Controlla il contenuto superiore inserto di textView in -viewDidLoad:

NSLog(@"NSStringFromUIEdgeInsets(self.itemTextField.contentInset) = %@", NSStringFromUIEdgeInsets(self.itemTextField.contentInset)); 

ripristinarlo in storyboard se non pari a zero

+0

'NSStringFromUIEdgeInsets (self.itemTextField.contentInset) = {0, 0, 0, 0}' Nessuna fortuna. – Napolux

+1

Log 'self.itemTextField.contentOffset' – LorikMalorik

+0

self.itemTextField.contentOffset = null – Napolux

15

è ho ottenuto attraverso lo stesso tipo di problema.

risolto disattivando l'inserti ScrollView automatica regolazione:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){ 
    self.automaticallyAdjustsScrollViewInsets = NO; // Avoid the top UITextView space, iOS7 (~bug?) 
} 
+0

Grazie! È il "codice" di una proprietà simile nello storyboard! – Napolux

+0

concordato. Questo è il codice dietro il modo di risolvere il problema. – t9mike

2

Ispirato da Kiattisak, ho implementato allineamento verticale come una categoria sopra UITextView in modo da poter controlla l'allineamento verticale di UITextView legacy.

Lo puoi trovare come gist here.

+1

Basta assicurarsi di rimuovere il valore chiave observer quando il VC viene deallocato – iwasrobbed

+0

Grazie @iWasRobbed, gist viene aggiornato. –

7

Questo è un problema abbastanza comune, quindi vorrei creare una sottoclasse UITextView semplice, in modo da poterlo riutilizzare e usarlo in IB.

vorrei usato il contentInset invece, facendo in modo di gestire correttamente il caso in cui l'contentSize è più grande dei limiti della textView

@interface BSVerticallyCenteredTextView : UITextView 

@end 

@implementation BSVerticallyCenteredTextView 

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     [self addObserver:self forKeyPath:@"contentSize" options: (NSKeyValueObservingOptionNew) context:NULL]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super initWithCoder:aDecoder]) 
    { 
     [self addObserver:self forKeyPath:@"contentSize" options: (NSKeyValueObservingOptionNew) context:NULL]; 
    } 
    return self; 
} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"contentSize"]) 
    { 
     UITextView *tv = object; 
     CGFloat deadSpace = ([tv bounds].size.height - [tv contentSize].height); 
     CGFloat inset = MAX(0, deadSpace/2.0); 
     tv.contentInset = UIEdgeInsetsMake(inset, tv.contentInset.left, inset, tv.contentInset.right); 
    } 
} 

- (void)dealloc 
{ 
    [self removeObserver:self forKeyPath:@"contentSize"]; 
} 

@end 
1

Ho avuto lo stesso problema con iOS 8.1, e nessuno di questi suggerimenti lavorato.

Cosa fatto lavoro è stato quello di andare nella Storyboard, e trascinare il mio UITableView o UITextView in modo che non sia più stata la prima visualizzazione secondaria di di UIView mio schermo.

http://www.codeproject.com/Tips/852308/Bug-in-XCode-Vertical-Gap-Above-UITableView

sembra essere legato ad avere un UIView incorporato in un UINavigationController.

Bug? Bug? Ho detto "bug" ...?

;-)

1

versione Swift della risposta di Tanguy.G:

if(UIDevice.currentDevice().systemVersion >= "7.0") { 
      self.automaticallyAdjustsScrollViewInsets = false; // Avoid the top UITextView space, iOS7 (~bug?) 
    } 
+0

Nota anche, che spesso devi chiamare per il layout: 'view.layoutIfNeeded()'. È molto fastidioso e eccezionalmente mal fatto in iOS. – Fattie

Problemi correlati