web-dev-qa-db-fra.com

Ajouter "padding" à un UITextView

comme le titre l'indique, j'essaie d'ajouter un comportement de type padding à un UITextView. L'affichage de texte est généré lorsque la vue est poussée à l'intérieur de mon contrôleur de navigation et le code suivant se produit:

 self.textView.layer.cornerRadius = 7;
 //pretty stuff is pretty

 NSString *description = appDelegate.productInDisplay.description;
 [self.textView setText:description];
 //pretty stuff has content now


 CGRect frame = textView.frame;
 frame.size.height = textView.contentSize.height;
 textView.frame = frame;
 //set the UITextView to the size of it's containing text.

 self.textView.editable = NO;

  self.theScrollView.contentSize = CGSizeMake(320, 250 + textView.frame.size.height);
  //set the parent scrollView's height to fit some other elements with fixed size (250)
  //and the pre-mentioned UITextView

donc, tout fonctionne et c'est ok, mais je veux ajouter du rembourrage sur les 4 côtés de l'UITextView et je n'ai pas pu le faire avec 3 heures de recherche pour quelque chose qui semble assez facile. Aucune suggestion?

36
magtak

EDIT 1/16/2015: Ceci a été écrit en 2012 et n'est plus précis. Utilisez -textContainerInset comme mentionné ci-dessus.

Message d'origine:

L'utilisation de contentInset ne fonctionnera pas réellement. Vous avez deux choix raisonnables: sous-classe UITextField et redéfinissez les méthodes textRectForBounds: et editRectForBounds: ou créez votre champ de texte de manière transparente sur une UIView et stylisez la UIView.

Exemple de sous-classement de l'UITextField:

- (CGRect)textRectForBounds:(CGRect)bounds {
     return CGRectInset(bounds, 5, 5);
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
     return CGRectInset(bounds, 5, 5);
}

Exemple d'enveloppement dans une UIView:

UIView *wrapView = [[UIView alloc] initWithFrame: CGRectMake(10, 10, 200, 30)];
[wrapView addSubview:textView];
wrapView.layer.borderColor = [UIColor darkGrayColor].CGColor;
wrapView.layer.borderWidth = 2.0;
wrapView.layer.cornerRadius = 5.0;
24
Jamon Holmgren

Avec iOS7, je l'ai fait avec

[self.textView setTextContainerInset:UIEdgeInsetsMake(0, 12, 0, 12)];

J'espère que cela aide, Mário

76
Mário Carvalho

Cette réponse est totalement fausse. La bonne réponse est simplement:

uitextview.textContainerInset =
       UIEdgeInsetsMake(8,5,8,5); // top, left, bottom, right

(Ces valeurs correspondent généralement à l'apparence d'un UITextField sur le même écran.)


Utilisez celui-ci:

self.textView.contentInset = UIEdgeInsetsMake(5, 5, 5, 5); 
54
Sergej Metelin

Cela a fonctionné pour moi en utilisant Swift 2.0:

textView.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10)

9
Julian B.

Pour Swift 4.2:

textview.contentInset = UIEdgeInsets(top: 2, left: 10, bottom: 2, right: 10)
5
LAD

Pour Swift 3 - la réponse semble être similaire, mais légèrement différente:

textview.contentEdgeInsets = UIEdgeInsets(top: 2, left: 10, bottom: 2, right: 10)

(En fait, j'ai utilisé ce qui précède pour un UIButtonView, mais comme il est si fermé aux réponses qui ont été publiées pour UITextView, je pense [en espérant] que cela s'applique aussi)

4
Adam Stoller

Cela fonctionne dans Swift 5:

textView.textContainerInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
1
Adam Foot

Créez simplement un extension de UITextView en utilisant Container Edge Inset comme suit:

extension UITextView {
    func leftSpace() {
        self.textContainerInset = UIEdgeInsets(top: 4, left: 6, bottom: 4, right: 4)
    }
}

et l'utiliser comme:

let textView = UITextView()
textView. leftSpace() 
0