Как установить поля (отступы) в UITextView? - PullRequest
49 голосов
/ 13 июля 2010

У меня есть UITextView для редактирования текста.По умолчанию у него есть небольшое поле вокруг текста.Я хочу увеличить это поле на несколько пикселей.

Свойство contentInset дает мне поля, но не меняет текст "ширина переноса".Текст переносится с той же шириной, а дополнительное «поле» заставляет представление прокручиваться горизонтально.

Есть ли способ заставить UITextView определенной ширины отображать текст с более узкой «шириной переноса»«

Ответы [ 9 ]

102 голосов
/ 12 января 2014

Начиная с iOS 7, вы можете использовать textContainerInset свойство:

Objective-C

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

Swift

textView.textContainerInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
34 голосов
/ 05 апреля 2013

Поработав некоторое время с этим, я нашел другое решение, если вы разрабатываете только для iOS 6. Установите верхнее и нижнее поля с помощью contentInset :

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

Длялевое и правое поля не добавляют ваш простой текст сразу, а вместо этого используют NSAttributedString с правильно установленными левыми и правыми отступами с 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];

Это дает вам UITextView с вашим текстом (в моем случае это переменная myText ) с отступом 20 пикселей, который правильно прокручивается.

10 голосов
/ 23 июля 2014

Попробуйте это

UIBezierPath* aObjBezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 20, 20)];
txtView.textContainer.exclusionPaths  = @[aObjBezierPath];
7 голосов
/ 13 июля 2010

Вы можете просто использовать меньший UITextView и поместить UIView на задний план для имитации заполнения.

+----------+
|          | <-- UIView (as background)
|   +--+   |
|   |  | <---- UITextView
|   |  |   |
|   +--+   |
|          |
+----------+
1 голос
/ 19 августа 2016

Спасибо за предложения.У меня была эта проблема при разработке приложения для MacOS / OSX, и в итоге я получил:

textView.textContainerInset = NSSize(width: 20, height: 20); //Sets margins
1 голос
/ 12 июля 2012

Это работает для меня.Изменение textView contentInset и вставки / позиции фрейма для получения правильных отступов и переноса слов.Затем измените границы textView, чтобы предотвратить горизонтальную прокрутку.Вам также необходимо сбрасывать отступ при каждом выделении и изменении текста.

- (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 голосов
/ 10 декабря 2018

, если вы хотите установить отступ с одной стороны, вы можете использовать следующий код:

 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 голосов
/ 11 октября 2018

Swift + iOS 12 : Другой подход

Установка отступов слева + справа от нашего UITextView позволила тексту исчезнуть при вводе большечто 9 строк текста.Использование решения @rajesh помогло решить эту проблему:

Обязательно вызывайте метод всякий раз, когда текст изменялся + устройство вращается.

    /// 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 голосов
/ 04 сентября 2017

Попробуйте код ниже

Для iOS7 используйте textContainerInset

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

Проверьте ссылку ниже, это может быть полезноВам

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...