2010-07-12 11 views
42

Ich habe eine UITextView für die Textbearbeitung. Standardmäßig hat es einen kleinen Rand um den Text herum. Ich möchte diesen Abstand um ein paar Pixel erhöhen.Wie werden Ränder (Padding) in UITextView festgelegt?

Die contentInset-Eigenschaft gibt mir Ränder, aber es ändert nicht den Text "Wrap Breite". Der Text wird mit der gleichen Breite umbrochen, und der zusätzliche "Rand" bewirkt nur, dass die Ansicht horizontal scrollt.

Gibt es eine Möglichkeit, ein UITextView einer bestimmten Breite den Text mit einer schmaleren "Wrap Breite" anzuzeigen?

Antwort

7

Sie könnten einfach eine kleinere UITextView verwenden und eine UIView in den Hintergrund plazieren, um die Auffüllung zu simulieren.

+----------+ 
|   | <-- UIView (as background) 
| +--+ | 
| | | <---- UITextView 
| | | | 
| +--+ | 
|   | 
+----------+ 
+1

Ja für Sie nützlich sein, das ist, was ich jetzt mache. Funktioniert ok für die Seitenränder, aber der obere Rand hat Probleme. Aus der Sicht des Benutzers wird Text beim Scrollen oben abgeschnitten, da Text nur in der UITextView gerendert wird. – strawtarget

+5

Und Sie können die vertikale Bildlaufleiste auf diese Weise nicht richtig anzeigen. – an0

+0

Wenn Sie 'textView.ClipsToBounds = NO 'setzen, wird das Abschneiden am oberen Rand" repariert ". Natürlich hilft das nicht, die vertikale Bildlaufleiste korrekt anzuzeigen. – villapossu

1

Dies funktioniert für mich. Ändern der textView contentInset- und Rahmeneinfügung/-position, um die richtige Auffüllung und Wortumbruch zu erhalten. Ändern Sie dann die textView-Grenzen, um horizontales Scrollen zu verhindern. Sie müssen das Padding jedes Mal zurücksetzen, wenn der Text ausgewählt und geändert wird.

- (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]; 
} 
+0

@Nate das funktioniert nicht für mich. Die Textansicht scrollt weiterhin horizontal und die Inhaltseinfügung wird außerhalb des Rahmens der Textansicht gelöscht – GoGreen

34

Nach Hantieren mit diesem für eine Weile fand ich eine andere Lösung, wenn Sie nur für iOS 6. die oberen und unteren Rand mit contentInset Set Entwicklung:

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

Für die linke und die rechten Ränder fügen Ihren Klartext nicht sofort hinzu, aber verwenden Sie stattdessen einen NSAttributedString mit richtig gesetzten linken und rechten Einzügen mit einem 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]; 

Dies gibt Ihnen eine UITextView mit Ihrem Text (in meinem Fall von dem variablen myText) mit 20 Pixeln Polsterung, die richtig scrollt.

89

ab iOS 7 können Sie textContainerInset Eigenschaft:

Objective-C

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

Swift

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

Versuchen Sie, diese

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

Danke für die Vorschläge. hatte ich dieses Problem, wenn eine macOS/OSX App zu entwickeln und damit endete:

textView.textContainerInset = NSSize(width: 20, height: 20); //Sets margins 
Verwandte Themen