2016-05-25 14 views
7

Trong ứng dụng iOS của tôi, tôi đang sử dụng NSAttributedString để tạo danh sách các dấu đầu dòng. Thật không may tôi đang đấu tranh với việc làm cho viên đạn trông có thể trình bày được. Nỗ lực đầu tiên của tôi là sử dụng văn bản thường xuyên và một ký tự unicode cho đạn, về cơ bản cách sử dụng một chuỗi như thế này:NSAttributedString và kiểu dáng html (liên kết dấu đầu dòng)

var attributedString = NSMutableAttributedString(
    string: "Here is a list of bullets and a paragraph introducing them, note that this paragraph spans multiple lines\n" + 
    "• This is the first bullet\n" + 
    "• Here is a second bullet\n" + 
    "• And here is a third bullet with a lot of text such that it overflows to the next line" 
) 

Kết quả là đây:

enter image description here

Tôi thích cách đạn tìm , nhưng các văn bản tràn trong viên đạn cuối cùng phải được liên kết với dòng trước và tôi không thể tìm ra cách để đạt được điều đó với văn bản thuần túy (mà không áp dụng cùng một liên kết với đoạn trên).

Lần thử thứ hai của tôi là sử dụng html trong NSAttributedString qua NSHTMLTextDocumentType và sử dụng các yếu tố <ul><li> để tạo các dấu đầu dòng.

let content = "Here is a list of bullets and a paragraph introducing them, note that this paragraph spans multiple lines" + 
    "<ul>" + 
     "<li>This is the first bullet</li>" + 
     "<li>Here is a second bullet</li>" + 
     "<li>And here is a third bullet with a lot of text such that it overflows to the next line</li>" + 
    "</ul>" 
var attributedString = try! NSMutableAttributedString(
    data: content, 
    options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], 
    documentAttributes: nil 
) 

Đó khắc phục sự cố đầu tiên nhưng giới thiệu một hình mới:

enter image description here

Những viên đạn đang cách nhau quá xa (cả hai từ cạnh bên trái và các văn bản trên bên phải). Tôi đã cố gắng sử dụng các thủ thuật html/css điển hình để sửa chữa căn chỉnh (<li style="text-indent: -10px;">) nhưng những kiểu này dường như bị NSAttributedString bỏ qua.

Tôi đã cố gắng khắc phục điều này bằng NSMutableParagraphStyle bổ sung nhưng dường như có nhiều tác hại hơn là tốt. Đây là những gì tôi đã cố gắng:

var paragraphStyle = NSMutableParagraphStyle() 
paragraphStyle.firstLineHeadIndent = 0 
paragraphStyle.headIndent = 20 
attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: attributedStringRange) 

Và đây là những gì tôi nhận:

enter image description here

Như bạn thấy, nó chỉ làm cho mọi việc tồi tệ hơn, đây là vấn đề của tôi với nó:

  • Nó bù đắp dòng thứ 2, nhưng tôi chỉ muốn hiệu ứng đó cho các dấu đầu dòng, không phải đoạn trước (tôi đoán tôi có thể khắc phục điều đó bằng cách giảm phạm vi mà hiệu ứng được áp dụng)
  • Tôi phải đoán/mã hóa khoảng trống, trong ví dụ tôi chọn 20 và điều đó không đủ cho các dấu đầu dòng được đặt cho cài đặt phông chữ hiện tại, có thể thay đổi
  • Vì lý do nào đó, khoảng cách dấu đầu thậm chí còn bị kéo dài hơn không có lý do gì cả, nó có vẻ như chỉ cần áp dụng một vani NSParagraphStyle mà không làm bất cứ điều gì làm điều này và tôi thấy không có tùy chọn để sửa lỗi này.

Tất cả những gì tôi thực sự muốn là khoảng cách dấu đầu dòng của tôi trông giống như ảnh chụp màn hình đầu tiên trong khi dòng thụt lề cho dòng thứ hai trông giống như thứ hai mà không phải cố định vị trí pixel chính xác. Các bạn có thể giúp tôi không?

Cảm ơn

+0

Bạn có thể tìm được giải pháp tốt cho việc này không? – flohei

+0

Thật không may tôi không còn nhớ những gì các giải pháp được, tôi nghĩ rằng đó là một số biến thể của câu trả lời được đăng. Tôi nghĩ rằng tôi đã kết thúc bằng cách sử dụng các yếu tố riêng biệt cho đoạn trên cùng và danh sách bullet, mà cảm thấy giống như một hack nhưng không có giá trị dành nhiều thời gian hơn. –

+0

Tôi hiểu. Đó là những gì tôi đang cố gắng tránh khi tôi nhận được toàn bộ văn bản từ API của chúng tôi và tôi thực sự không muốn gây rối với kết quả vì chúng có thể thay đổi đáng kể. Vì vậy, tôi có lẽ sẽ kết thúc với trường hợp ngoại lệ trên trường hợp ngoại lệ. Dù sao, cảm ơn bạn đã trả lời! – flohei

Trả lời

4

tôi đã có thêm phong cách tùy chỉnh cho một danh sách và đây là kiểu đoạn tôi đã kết thúc sử dụng cho mỗi viên đạn trong một NSAttributedString

Các headIndentfirstLineHeadIndent có thể thay đổi nhưng vị trí NSTextTab nên được giống như headIndent

NSMutableParagraphStyle *const bulletParagraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
bulletParagraphStyle.headIndent = 60; 
bulletParagraphStyle.firstLineHeadIndent = 30; 
NSTextTab *listTab = [[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentNatural location:60 options:@{}]; 
bulletParagraphStyle.tabStops = @[listTab]; 

này hoạt động giả định điểm đạn của bạn có một \t sau nó (và sau đó văn bản)

+1

Cảm ơn, điều này gần như hoạt động, bây giờ tôi đang cố gắng tách biệt thụt lề của đoạn trên khỏi viên đạn (cố gắng với NSRange bây giờ và nó không hợp tác, vì vậy tôi sẽ quay lại đây một lần con số nó ra). –

+0

có cùng một vấn đề, easilly cố định nó bằng cách sử dụng html

bố cục nhưng không thực sự thích sử dụng bảng – Injectios

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