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?
À 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)
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];
Vous pouvez simplement utiliser une UITextView plus petite et placer une UIView en arrière-plan pour simuler le remplissage.
+----------+
| | <-- UIView (as background)
| +--+ |
| | | <---- UITextView
| | | |
| +--+ |
| |
+----------+
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
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];
}
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]
}
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
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