web-dev-qa-db-fra.com

Comment définir les marges (remplissage) dans UITextView?

J'ai un UITextView pour l'édition de texte. Par défaut, il y a une petite marge autour du texte. Je veux augmenter cette marge de quelques pixels.

La propriété contentInset me donne des marges, mais elle ne modifie pas le texte "largeur de l'enveloppe". Le texte est enveloppé à la même largeur et la "marge" supplémentaire fait simplement défiler la vue horizontalement.

Existe-t-il un moyen de faire en sorte qu’une UITextView d’une certaine largeur affiche le texte avec une "largeur de contour" plus étroite?

49
strawtarget

À partir de iOS 7, vous pouvez utiliser la propriété textContainerInset:

Objectif c

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

Rapide

textView.textContainerInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
102
Karlis

Après avoir bricolé avec cela pendant un moment, j'ai trouvé une autre solution si vous ne développiez que pour iOS 6. Définissez les marges supérieure et inférieure avec contentInset :

textView = [[UITextView alloc] init];
textView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 20.0, 0.0);

Pour les marges gauche et droite, n’ajoutez pas votre texte brut immédiatement mais utilisez un NSAttributedString à la place avec des retraits à gauche et à droite correctement définis avec un NSMutableParagraphStyle :

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.headIndent = 20.0;
paragraphStyle.firstLineHeadIndent = 20.0;
paragraphStyle.tailIndent = -20.0;

NSDictionary *attrsDictionary = @{NSFontAttributeName: [UIFont fontWithName:@"TrebuchetMS" size:12.0], NSParagraphStyleAttributeName: paragraphStyle};
textView.attributedText = [[NSAttributedString alloc] initWithString:myText attributes:attrsDictionary];

Cela vous donne un UITextView avec votre texte (dans mon cas de la variable myText ) avec un remplissage de 20 pixels qui défile correctement.

Essaye ça

UIBezierPath* aObjBezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 20, 20)];
txtView.textContainer.exclusionPaths  = @[aObjBezierPath];
9
Rajesh

Vous pouvez simplement utiliser une UITextView plus petite et placer une UIView en arrière-plan pour simuler le remplissage.

+----------+
|          | <-- UIView (as background)
|   +--+   |
|   |  | <---- UITextView
|   |  |   |
|   +--+   |
|          |
+----------+
7
kennytm

Merci pour les suggestions . J'ai eu ce problème lors du développement d’une application MacOS/OSX et je me suis retrouvé avec ceci:

textView.textContainerInset = NSSize(width: 20, height: 20); //Sets margins
1
Michael Andersen

Cela fonctionne pour moi. Modification de textView contentInset et de frame/encart/position pour obtenir le remplissage et le retour à la ligne corrects. Ensuite, changez les limites de textView pour empêcher le défilement horizontal. Vous devez également réinitialiser le remplissage à chaque fois que le texte est sélectionné et modifié. 

- (void)setPadding
{
    UIEdgeInsets padding = UIEdgeInsetsMake(30, 20, 15, 50);

    textView.contentInset = padding;

    CGRect frame = textView.frame;

    // must change frame before bounds because the text wrap is reformatted based on frame, don't include the top and bottom insets
    CGRect insetFrame = UIEdgeInsetsInsetRect(frame, UIEdgeInsetsMake(0, padding.left, 0, padding.right));

    // offset frame back to original x
    CGFloat offsetX = frame.Origin.x - (insetFrame.Origin.x - ( padding.left + padding.right ) / 2);
    insetFrame = CGRectApplyAffineTransform(insetFrame, CGAffineTransformMakeTranslation(offsetX, 0));

    textView.frame = insetFrame;

    textView.bounds = UIEdgeInsetsInsetRect(textView.bounds, UIEdgeInsetsMake(0, -padding.left, 0, -padding.right));

    [textView scrollRectToVisible:CGRectMake(0,0,1,1) animated:NO];
}

-(void)textViewDidChangeSelection:(UITextView *)textView
{
    [self setPadding];
}

-(void)textViewDidChange:(UITextView *)textView
{
    [self setPadding];
}
1
Nate Potter

Swift + iOS 12 : Une approche différente

Régler le padding à gauche + à droite de notre UITextView a laissé le texte disparaître lorsque vous avez saisi plus de 9 lignes de texte. Utiliser la solution de @rajesh a permis de résoudre ce problème: 

Assurez-vous d'invoquer la méthode chaque fois que le texte a été modifié + le périphérique pivote.

    /// Updates the left + right padding of the current text view.
    /// -> leftRightPadding value = 11.0
    func updateLeftRightPadding() {
        let leftPadding = UIBezierPath(rect: .init(x: 0.0, y: 0.0,
                                       width: leftRightPadding, height: contentSize.height))
        let rightPadding = UIBezierPath(rect: .init(x: frame.width - leftRightPadding, y: 0.0,
                                        width: 11, height: contentSize.height))
        textContainer.exclusionPaths = [leftPadding, rightPadding]
    }
0
Bem

Essayez ci-dessous le code

Pour iOS7, utilisez textContainerInset.

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

Vérifiez le lien ci-dessous, il pourrait vous être utile

https://stackoverflow.com/a/22935404/5184217

0
Rajesh Dharani

si vous voulez définir le rembourrage d'un côté, vous pouvez utiliser le code ci-dessous:

 textView.contentInset.left = 5 //For left padding
 textView.contentInset.right = 5 //For right padding
 textView.contentInset.top = 5 //For top padding
 textView.contentInset.bottom = 5 //For bottom padding
0
Pankaj Jangid