web-dev-qa-db-fra.com

Alignement vertical iOS 7 UITextView

Comment est-il possible que mon UITextView modifiable (placé à l'intérieur d'un UIViewController simple à l'intérieur d'un UISplitView qui agit comme délégué pour le UITextView) n'affiche pas le texte depuis le début mais après quelque chose comme 6-7 lignes?

Screenshot

Je n'ai pas défini de mise en page automatique particulière ou quelque chose de similaire, essayer de supprimer du texte n'aide pas (donc pas de caractères cachés ou quelque chose).

J'utilise iOS 7 sur iPad, le storyboard a l'air bien ... Le problème est le même sur le simulateur iOS et les vrais appareils. Je deviens fou: P

Voici du code. Ceci est le 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
}

Et voici les fonctions remplacées pour le UITextView J'utilise un code que j'ai trouvé sur StackOverflow pour simuler un espace réservé pour la vue (le même truc sur la version iPhone du storyboard fonctionne bien) ...

// 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;
}
27
Napolux

Essayez d'appeler -sizeToFit après avoir passé le texte. Cette réponse pourrait être utile pour Aligner verticalement le texte dans un UILabel .
[MISE À JOUR]
Je mets à jour cette réponse pour la rendre plus lisible.
. Cela se produit uniquement si la vue de défilement est la vue principale ou les premières sous-vues. Pour éviter cela, vous devez désactiver ce comportement en définissant automaticallyAdjustsScrollViewInsets sur NO ou en remplaçant cette méthode pour renvoyer NO.

34
Andrea

J'ai traversé le même genre de problème.

Résolu en désactivant le réglage automatique des incrustations de scrollView:

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

Il s'agit d'un problème assez courant, je créerais donc une simple sous-classe UITextView, afin que vous puissiez la réutiliser et l'utiliser dans IB.

J'utiliserais le contentInset à la place, en veillant à gérer avec élégance le cas où le contentSize est plus grand que les limites du 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
7
Jeff Holliday

utilisez -observerForKeyPath avec contentSize KeyPath

Regardez du code sur Mon Blog (ne vous concentrez pas sur la langue thaï )

http://www.macbaszii.com/2012/10/ios-dev-uitextview-vertical-alignment.html

4

Inspiré par Kiattisak, j'ai implémenté l'alignement vertical en tant que catégorie sur UITextView afin que vous puissiez contrôler l'alignement vertical de l'héritage UITextView.

Vous pouvez le trouver sous la forme d'un Gist here .

2
Tom Susel

Version Swift de la réponse de Tanguy.G:

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

J'ai eu le même problème avec iOS 8.1, et aucune de ces suggestions n'a fonctionné.

Ce que a fait était d'aller dans le Storyboard et de faire glisser mon UITableView ou UITextView pour qu'il ne soit plus la première sous-vue du UIView de mon écran.

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

Il semble être lié à un UIView intégré dans un UINavigationController.

Punaise ? Punaise ? Ai-je dit "bug" ...?

;-)

1
Mike Gledhill

Vérifiez l'encart de contenu supérieur de textView dans -viewDidLoad:

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

Réinitialisez-le dans le storyboard s'il n'est pas nul

0
LorikMalorik