2016-03-11 16 views
7

Tôi muốn vẽ một đường tùy biến bên trong một UITextView gồm một số văn bản (sử dụng NSAttributedString)Vẽ một đường bên trong một UITextView - NSAttributedString

Đây là những gì tôi đã cố gắng

NSString *unicodeStr = [NSString stringWithFormat:@"%C%C%C", 0x00A0, 0x0009, 0x00A0]; //nbsp, tab, nbsp 
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:unicodeStr]; 
NSRange strRange = NSMakeRange(0, str.length); 

NSMutableParagraphStyle *const tabStyle = [[NSMutableParagraphStyle alloc] init]; 
tabStyle.headIndent = 16; //padding on left and right edges 
tabStyle.firstLineHeadIndent = 16; 
tabStyle.tailIndent = -16; 
NSTextTab *listTab = [[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentCenter location:40 options:@{}]; //this is how long I want the line to be 
tabStyle.tabStops = @[listTab]; 
[str addAttribute:NSParagraphStyleAttributeName value:tabStyle range:strRange]; 
[str addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInt:2] range:strRange]; 

Nhưng không có vấn đề gì giá trị tôi cung cấp cho các vị trí dừng tab (40 trong trường hợp này) và tailIndent (-16 ở đây), dòng chỉ tôn trọng headIndent và kéo dài toàn bộ chiều rộng UITextView (trừ headIndent tất nhiên).

EDIT - Tôi khá chắc chắn vấn đề là vì tôi không sử dụng các ký tự unicode chính xác (mặc dù chúng có vẻ là lựa chọn hợp lý). Trong trường hợp điều này đưa ra gợi ý cho ai đó, nếu tôi thêm dấu cách sau ngày thứ 2, nghĩa là tab được giới hạn ở một độ dài tab duy nhất

+0

Bạn có thể cung cấp ví dụ về nội dung bạn muốn hiển thị không? –

+0

Tôi đang cố triển khai thẻ hr (quy tắc ngang). Chúng không được NSAttributedString hỗ trợ khi chuyển đổi từ html – lostInTransit

Trả lời

2

Đó có phải là kết quả mong đợi của bạn không?

enter image description here enter image description here

Bạn có thể thử này:

NSTextTab *listTab = [[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentCenter location:self.textView.frame.size.width - tabStyle.firstLineHeadIndent + tabStyle.tailIndent options:@{}]; 

Và đây là đoạn code đầy đủ:

- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    NSString *unicodeStr = @"\n\u00a0\t\t\n"; 
    NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:unicodeStr]; 
    NSRange strRange = NSMakeRange(0, str.length); 

    NSMutableParagraphStyle *const tabStyle = [[NSMutableParagraphStyle alloc] init]; 
    tabStyle.headIndent = 16; //padding on left and right edges 
    tabStyle.firstLineHeadIndent = 16; 
    tabStyle.tailIndent = -70; 
    NSTextTab *listTab = [[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentCenter location:self.textView.frame.size.width - tabStyle.headIndent + tabStyle.tailIndent options:@{}]; //this is how long I want the line to be 
    tabStyle.tabStops = @[listTab]; 
    [str addAttribute:NSParagraphStyleAttributeName value:tabStyle range:strRange]; 
    [str addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInt:2] range:strRange]; 

    NSAttributedString *htmlStr = [[NSAttributedString alloc] initWithData:[@"<h1>Lorem ipsum dolor sit er elit lamet</h1>" dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil]; 

    [str insertAttributedString:htmlStr atIndex:0]; 
    [str appendAttributedString:htmlStr]; 

    self.textView.attributedText = str; 
} 
+0

Đã có, không hoạt động. Tôi khá chắc chắn nó có cái gì đó để làm với các nbsp trên hai mặt của tab, nhưng tôi không thể tìm ra lý do tại sao – lostInTransit

+0

Đây có phải là những gì tôi muốn - có. Nhưng tôi có một số văn bản trước và sau (html) và có vẻ như để mess up các quy tắc ngang (tôi đoán?). Mã này dường như không khác mấy so với những gì tôi có. Không chắc tại sao nó không hiệu quả với tôi. – lostInTransit

+0

dường như hoạt động! Cảm ơn bạn – lostInTransit

0

Đây là những gì tôi đã làm để giải quyết cùng một vấn đề. Nó sử dụng một lớp con của NSTextTab:

import UIKit 

class RightAnchoredTextTab : NSTextTab { 
    weak var textContainer : NSTextContainer! 

    required init(textAlignment alignment: NSTextAlignment, location loc: CGFloat, options: [String : AnyObject], textContainer aTextContainer : NSTextContainer) { 
     super.init(textAlignment: alignment, location: loc, options: options) 
     textContainer = aTextContainer 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override var location: CGFloat { 
     get { 
      return textContainer.size.width-textContainer.lineFragmentPadding*2-super.location 
     } 
    } 
} 

Và tương tự bit tương tự như các giải pháp khác:

func horizontalLine(indent : CGFloat = 30, width : CGFloat = 1) -> NSAttributedString 
{ 
    let paragraphStyle = NSMutableParagraphStyle() 

    paragraphStyle.tabStops = [] 
    paragraphStyle.addTabStop(NSTextTab(textAlignment: .Left, location: indent, options: [:])) 
    paragraphStyle.addTabStop(RightAnchoredTextTab(textAlignment: .Right, location: indent, options: [:], textContainer : textView.textContainer)) 
    paragraphStyle.alignment = .Left 

    let attributes = [NSParagraphStyleAttributeName : paragraphStyle, NSStrikethroughStyleAttributeName : width] 

    textView.backgroundColor = UIColor.yellowColor() 
    let ZeroWidthNonBreakingSpace = "\u{FEFF}" 
    return NSAttributedString(string: "\t\(ZeroWidthNonBreakingSpace)\t\(ZeroWidthNonBreakingSpace)\n", attributes: attributes) 
} 

Một vài lưu ý:

  • nó có thể sẽ chỉ làm việc với một container văn bản vuông đơn .
  • NSTextContainerlineFragmentPadding. Nếu bạn đã từng tự hỏi tại sao bạn phải thụt lề một tab căn phải bằng 10 thì đây là: giá trị mặc định là 5.
  • tiền tố văn bản với \n có nghĩa là không có gạch ngang. Không biết tại sao.
  • Giải pháp này hoạt động với phép quay v.v. UITextView gọi NSTextTab.location lần nữa khi các giới hạn được thay đổi.
Các vấn đề liên quan