wake-up-neo.com

Wie kann man Ränder (Auffüllen) in UITextView setzen?

Ich habe eine UITextView zur Textbearbeitung. Standardmäßig hat der Text einen kleinen Rand. Ich möchte diesen Spielraum um einige Pixel erhöhen.

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

Gibt es eine Möglichkeit, eine UITextView mit einer bestimmten Breite den Text mit einer schmaleren "Umbruchbreite" anzeigen zu lassen?

49
strawtarget

Ab iOS 7 können Sie die textContainerInset-Eigenschaft verwenden:

Ziel c

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

Swift

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

Nachdem ich eine Weile damit herumgespielt hatte, fand ich eine andere Lösung, wenn Sie nur für iOS 6 entwickeln. Stellen Sie den oberen und den unteren Rand mit contentInset ein:

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

Fügen Sie für den linken und den rechten Rand nicht Ihren Klartext direkt hinzu, sondern verwenden Sie stattdessen einen NSAttributedString mit korrekt festgelegten linken und rechten Einrückungen 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];

Dadurch erhalten Sie eine UITextView mit Ihrem Text (in meinem Fall aus der Variablen myText ) mit 20 Pixeln, die korrekt gescrollt werden.

Versuche dies

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

Sie können einfach eine kleinere UITextView verwenden und eine UIView im Hintergrund platzieren, um die Auffüllung zu simulieren.

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

Vielen Dank für die Vorschläge. Ich hatte dieses Problem beim Entwickeln einer macOS/OSX-App und endete damit:

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

Das funktioniert für mich. Ändern von textView contentInset und Frame Inset/Position, um die korrekte Auffüllung und den richtigen Zeilenumbruch zu erhalten Ändern Sie dann die textView-Begrenzungen, um ein horizontales Scrollen zu verhindern. Sie müssen auch die Auffüllung 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];
}
1
Nate Potter

Swift + iOS 12 : Ein anderer Ansatz

Wenn Sie den Abstand links und rechts von unserer UITextView einstellen, verschwindet der Text, wenn Sie mehr als 9 Textzeilen eingeben. Die Lösung von @rajesh hat geholfen, dieses Problem zu lösen: 

Stellen Sie sicher, dass Sie die Methode immer dann aufrufen, wenn sich der Text geändert hat + sich das Gerät dreht.

    /// 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

Versuchen Sie es mit dem folgenden Code

Verwenden Sie für iOS7 textContainerInset

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

Überprüfen Sie den Link, der für Sie nützlich sein kann

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

0
Rajesh Dharani

wenn Sie das Auffüllen von einer Seite einstellen möchten, können Sie den folgenden Code verwenden:

 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