Ответ 1
Начиная с iOS 7 вы можете использовать свойство textContainerInset
:
Objective-C
textView.textContainerInset = UIEdgeInsetsMake(0, 20, 0, 20);
Swift
textView.textContainerInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
У меня есть UITextView для редактирования текста. По умолчанию у него небольшой размер текста. Я хочу увеличить эту маржу на несколько пикселей.
Свойство contentInset дает мне поля, но не меняет текст "ширина обертки". Текст обернут с одинаковой шириной, а дополнительный "margin" просто заставляет просмотр прокручиваться по горизонтали.
Есть ли способ сделать UITextView определенной ширины отображать текст с более узкой "шириной обертки"?
Начиная с iOS 7 вы можете использовать свойство textContainerInset
:
Objective-C
textView.textContainerInset = UIEdgeInsetsMake(0, 20, 0, 20);
Swift
textView.textContainerInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
После долгой работы я нашел другое решение, если вы только разрабатываете для 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 пикселей, которое правильно прокручивается.
Попробуйте это
UIBezierPath* aObjBezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 20, 20)];
txtView.textContainer.exclusionPaths = @[aObjBezierPath];
Вы можете просто использовать меньший UITextView и поместить UIView в фоновом режиме для имитации заполнения.
+----------+
| | <-- UIView (as background)
| +--+ |
| | | <---- UITextView
| | | |
| +--+ |
| |
+----------+
Это работает для меня. Изменение содержимого textViewInset и вставки/рамки рамки для получения правильного заполнения и переноса слов. Затем измените границы textView, чтобы предотвратить горизонтальную прокрутку. Вы также должны reset заполнять каждый раз, когда текст выбран и изменен.
- (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];
}
Спасибо за предложения. У меня возникла эта проблема при разработке приложения macOS/OSX и в итоге:
textView.textContainerInset = NSSize(width: 20, height: 20); //Sets margins
Попробуйте ввести код
Для iOS7 используйте textContainerInset
textView.textContainerInset = UIEdgeInsetsMake (0, 20, 0, 20);
Проверьте ниже ссылку, которая вам может пригодиться
Swift + iOS 12: другой подход
Установка UITextView
слева + справа от нашего 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]
}
если вы хотите установить отступ с одной стороны, вы можете использовать следующий код:
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