2010-07-12 34 views
42

Tôi có một UITextView để chỉnh sửa văn bản. Theo mặc định, nó có một lề nhỏ xung quanh văn bản. Tôi muốn tăng tỷ lệ ký quỹ đó lên vài pixel.Làm cách nào để đặt lề (đệm) trong UITextView?

Thuộc tính contentInset cho tôi lề, nhưng không thay đổi văn bản "chiều rộng bọc". Văn bản được gói ở cùng chiều rộng và "lề" bổ sung chỉ khiến cho chế độ xem cuộn theo chiều ngang.

Có cách nào để tạo UITextView có chiều rộng nhất định hiển thị văn bản có chiều rộng "hẹp hơn" không?

Trả lời

7

Bạn chỉ có thể sử dụng UITextView nhỏ hơn và đặt UIView ở chế độ nền để mô phỏng phần đệm.

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

Yeah, đó là những gì tôi đang làm bây giờ. Hoạt động tốt cho các lề bên lề, nhưng lề trên có vấn đề. Từ quan điểm của người dùng, văn bản được "cắt" ở trên cùng trong khi cuộn vì văn bản chỉ hiển thị trong UITextView. – strawtarget

+5

Và bạn có thể không hiển thị đúng thanh cuộn dọc theo cách này. – an0

+0

Đặt 'textView.clipsToBounds = NO' sẽ" sửa "cắt ở đầu, sắp xếp. Tất nhiên, điều này sẽ không giúp hiển thị thanh cuộn dọc một cách chính xác. – villapossu

1

Điều này phù hợp với tôi. Thay đổi textView contentInset và khung inset/position để có được vùng đệm và từ bọc chính xác. Sau đó thay đổi các giới hạn textView để ngăn cuộn ngang. Bạn cũng cần phải đặt lại vùng đệm mỗi khi văn bản được chọn và thay đổi.

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

@Này không hoạt động cho tôi. Chế độ xem văn bản vẫn cuộn theo chiều ngang và nội dung chèn vào bên ngoài khung của chế độ xem văn bản – GoGreen

34

Sau khi quan trọng xung quanh với điều này trong một thời gian tôi thấy một giải pháp khác nếu bạn chỉ đang phát triển dành cho iOS 6. Thiết lập các lề trên và dưới với contentInset:

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

Đối với trái và lề phải không thêm văn bản thuần túy của bạn ngay lập tức nhưng thay vào đó hãy sử dụng NSAttributedString với các khoảng trống trái và phải được đặt chính xác với 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]; 

Điều này cung cấp cho bạn một UITextView với văn bản của bạn (trong trường hợp của tôi từ biến myText) với 20 pixel đệm đúng cách cuộn.

89

Bắt đầu từ iOS 7 bạn có thể sử dụng textContainerInset tài sản:

Objective-C

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

Swift

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

Hãy thử điều này

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

Cảm ơn các đề xuất. Tôi có vấn đề này khi phát triển một ứng dụng hệ điều hành MacOS/OSX và kết thúc với điều này:

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

Hãy thử mã dưới đây

Đối với iOS7 sử dụng textContainerInset

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

Kiểm tra bên dưới liên kết nó có thể hữu ích cho bạn

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

Các vấn đề liên quan