2013-03-10 30 views
6

Đây là định dạng PDF sử dụng đồ họa lõi. Nhưng nó có thể là về bất kỳ loại phân trang khi nói đến in một chuỗi trên hai trang.Làm cách nào để xác định phần nào của nsstring phù hợp với trực tràng?

Tôi cần truyền một chuỗi trên nhiều trang. Đối với các chuỗi nhỏ hơn, đây không phải là vấn đề thực sự. Đối với những người tôi sử dụng các phần mở rộng NSString UIKit sizeWithFont để xác định, liệu văn bản đầy đủ có phù hợp trên trang hiện tại hay không. Nếu có, sau đó tôi in nó với drawInRect và nếu không thì tôi chuyển nó sang trang tiếp theo.

Hoạt động tốt nhưng không phù hợp với các chuỗi dài hơn. Trong các chuỗi cá nhân của ứng dụng của tôi (được cung cấp bởi người dùng) thậm chí có thể dài hơn một trang đầy đủ.

Khi có một trang đầy đủ hoặc một số không gian còn lại của trang được cung cấp, làm cách nào để xác định chính xác phần nào của NSString có thể được hiển thị trong phần đính kèm đó để tôi có thể cắt và in chuỗi còn lại (hoặc ít nhất là một phần của nó) trên trang tiếp theo?

Tôi đã nghĩ đến giải pháp thay thế. Đó là vẽ toàn bộ văn bản vào một bối cảnh đồ họa tắt màn hình và sau đó cắt hình ảnh được tạo thành các lát phù hợp với không gian trống trên các trang. Nhưng nếu tôi làm vậy thì tôi cần đặt đường cắt chính xác giữa các dòng văn bản. Và thành thật mà nói, tôi không chắc chắn làm thế nào để tìm ra nơi các văn bản có chứa đồ họa có thể được cắt một cách an toàn thành hai (hoặc nhiều hơn) các bộ phận mà không cần cắt một dòng văn bản ở giữa của nó.

Tôi hy vọng tôi thể hiện bản thân mình dễ hiểu và rằng ai đó đến để giải cứu.

+1

+1, Cuối cùng, ai đó đã nêu rõ câu hỏi hóc búa này. – CodaFi

+0

Tôi nghi ngờ bạn thực sự muốn làm điều này bằng cách sử dụng thay thế của bạn ... Nếu điều này là về hình ảnh bitmap, Ok, nhưng bạn chắc chắn không muốn văn bản của bạn bao gồm trong PDF của bạn như bitmap ... – mkl

+0

@mkl, bạn nói đúng. Đó là lý do tại sao tôi hỏi. Tuy nhiên, cuối cùng tôi cần một pdf in hoàn toàn bố trí trên giấy. Bất kỳ ý tưởng? –

Trả lời

2

Trong Lõi Text, có a very relevant function, mà cuối cùng tranh luận (một con trỏ đến một CFRange) được định nghĩa như sau:

fitRange
Khi trở về, có chứa một loạt các chuỗi mà thực sự phù hợp với kích thước hạn chế.
+0

Xin lỗi vì phản hồi muộn. Tôi phải đặt dự án này sang một bên ngay sau khi đặt câu hỏi này do các ưu tiên. Bây giờ tôi tiếp tục làm việc trên nó tôi thấy rằng đề nghị của bạn, hoặc một trong những liên kết, hoạt động hoàn toàn đúng. Cảm ơn gợi ý. –

+0

Hi hermann Tôi cũng đang đối mặt với cùng một vấn đề. Nhưng tôi đang tạo tệp PDF bằng cách sử dụng các phương thức UIKit và bằng cách sử dụng yêu thích Xin chào trong ứng dụng của tôi, tôi phải tạo tệp PDF bằng cách nhận dữ liệu từ một thế hệ Array.Pdf được thực hiện thành công bằng các phương thức UIKit như drawrect và sử dụng UIGraphicsBeginPDFContextToFile (thefilePath, CGRectZero, nil); UIGraphicsBeginPDFPageWithInfo (CGRectMake (0, 0, pageSize.width, pageSize.height), .Tôi có thể không thể quyết định độ dài của chuỗi có thể vừa với bất kỳ hàng nào và chuỗi còn lại trong một hàng khác trong trang tiếp theo. – Naresh

+0

@Naresh: Tôi nghĩ bạn nên hỏi một câu hỏi mới giải thích những gì bạn đang làm và vấn đề bạn đang gặp phải chi tiết hơn. –

0

Cách sử dụng xấp xỉ?

- (NSInteger)lengthOfString:(NSString *)str 
      thatFitsIntoView:(UIView *)displayView 
        withFont:(UIFont *)font 
{ 
    CGSize textSize = [str sizeWithFont:font 
           forWidth:displayView.frame.size.width 
          lineBreakMode:NSLineBreakByWordWrapping]; 

    NSInteger lengthThatFits; 
    if (textSize.height > displayView.frame.size.height) { 
     lengthThatFits = str.length * displayView.frame.size.height/textSize.height; 
    } else { 
     lengthThatFits = str.length; 
    } 

    return lengthThatFits; 
} 

Gọi nó thích:

NSString *str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eros" 
    "nulla, commodo eget fringilla nec, varius nec ligula. Donec pulvinar eros sed diam" 
    "euismod scelerisque. Mauris imperdiet leo at elit vulputate ullamcorper. Nullam" 
    "condimentum odio a lacus tempus ac pretium justo tincidunt."; 

UIFont *font = [UIFont systemFontOfSize:16.0]; // or whatever 
UIView *displayView = // the view in which you intend to present the string 

NSInteger length = [self lengthOfString:str thatFitsIntoView:displayView usingFont:font]; 
NSString *displayedString = [str substringToIndex:length]; 
+0

Có, nếu tôi không tìm thấy bất cứ điều gì tốt hơn thì tôi sẽ phải đi cho một xấp xỉ. Một xấp xỉ sẽ cần phải xem xét dòng/từ. Tôi thậm chí có thể "gói câu". Có nghĩa là tôi sẽ cắt chuỗi chỉ sau khi dừng đầy ".", Dấu chấm phẩy, v.v.Và sau đó kiểm tra một phần của chuỗi cho dù nó thực sự phù hợp với rect. Nhưng điều đó sẽ phụ thuộc vào người dùng nhập vào reasonalbe. Đề xuất của bạn sẽ thất bại nếu người dùng nhập một số lượng đáng kể cr/lf. Tôi cần một cái gì đó chính xác hơn. Một số 'numberOfCharsOfString: fitIntoRect: withFont: lineBreakMode:' hoặc như vậy. –

+0

@HermannKlecker Điều này thực hiện chính xác điều đó. Trả về số ký tự phù hợp. Bạn có thể tinh chỉnh kết quả bằng cách bắt đầu lặp lại từ 'lengthThatFits' về 0 và kiểm tra xem chuỗi con cho đến khi chỉ mục đó khớp với. –

+0

Tôi đánh giá cao sự hỗ trợ của bạn. Nhưng tôi nghi ngờ rằng nó thực sự chính xác mũ. Đầu tiên nó xác định chiều cao của khối văn bản theo cách thông thường. Sau đó, nó sẽ kiểm tra xem khối văn bản có vừa với trang hay không. Tốt cho đến nay. Nhưng sau đó nó chỉ lấy mối quan hệ của chiều cao văn bản đầy đủ với kích thước của không gian trống trên trang và nhân mối quan hệ đó với số ký tự và trả về kết quả đó. (tiếp ...) –

2

Đối với trường hợp chung mà bạn không sử dụng Core Text, bạn chỉ có thể giữ thêm ký tự vào chuỗi cho đến khi kích thước của nó quá lớn. Điều này có thể khá nhanh, và nếu bạn có các chuỗi rất lớn (như bạn dường như), bạn có thể tăng tốc nó bằng một tìm kiếm nhị phân đơn giản.

Nếu bạn đang sử dụng Văn bản chính, chỉ cần tạo CTFrame cho khu vực bạn muốn điền và sau đó hỏi nó cho phạm vi được sử dụng với CTFrameGetVisibleStringRange().

+0

Rob và Peter, tôi chắc chắn sẽ có một cái nhìn tại văn bản cốt lõi. Cảm ơn. –

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