2012-08-03 42 views
9

Có cách nào để bỏ qua nội dung văn bản của một NSTextField, thay vì cắt ngắn không?Bỏ qua NSTextField?

Vì vậy, thay vì:

The quick brown fox jumped over 

Nó sẽ nói:

The quick brown fox jumped ... 

tôi không thể tìm thấy bất cứ điều gì trong tài liệu cho việc này. Tôi đang thiếu gì?

CẬP NHẬT: Có cách nào để bỏ qua và wordwrap - nói cách khác, có nhiều dòng và bỏ qua lần cuối cùng không?

+0

Tôi nghĩ việc chọn truncate hoặc 'NSLineBreakByTruncatingTail' sẽ tự động làm hình elip - – Vervious

+0

Chad, nếu bạn đã cho tôi tiền thưởng cảm ơn bạn và bây giờ tôi cảm thấy tồi tệ vì tôi không thực sự trả lời câu hỏi của bạn. Một người nào đó dinged tôi này (downvoted câu trả lời), rất buồn cười tôi chỉ cần relooked tại câu hỏi và cập nhật của bạn. Tôi có một gợi ý cho bạn và sẽ chỉnh sửa câu trả lời của tôi ngay bây giờ. –

+0

Không sao, @DavidH! Bạn đã trả lời câu hỏi như ban đầu được hỏi - tôi đã bỏ quên bao gồm phần "ellipsize AND wordwrap" khiến câu hỏi trở nên khó khăn. Và bạn được chào đón về tiền thưởng - cảm ơn bạn vì những suy nghĩ bạn đã thêm vào! –

Trả lời

7

Vì vậy, đây là một câu hỏi hay! Mặc dù nó tiếp xúc với IB, nó không phải là tài sản trên quan điểm hoặc bất kỳ tiểu sử nào. Thay vào đó, nó được chôn cất như một tài sản trên ô được sử dụng bởi NSTextField. Vì vậy, nếu bạn hỏi đối tượng đó cho ô của nó, bạn có thể đọc hoặc đặt giá trị: lineBreakMode.

Tìm trong mô tả lớp cho NSCell cho tất cả các tùy chọn - truncateCenter là một (để lấy dấu ba chấm ở giữa).

CHỈNH SỬA: những suy nghĩ sau đây được nhắc bởi câu hỏi được cập nhật. Cá nhân, tôi nghĩ rằng cố gắng để có được mã google đó là cách overkill và có lẽ bạn có thể làm một cái gì đó ít phức tạp hơn bằng cách tạo ra một textField mini-custom.

  • tạo ra một đối tượng NSView khách hàng và cung cấp cho nó một chuỗi và tài sản phông chữ và một số phương pháp liên quan đến các hành động dưới đây, và có lẽ thậm chí là một tài sản rộng

  • về cơ bản ý tưởng là sử dụng các loại Cocoa NSString cho phép bạn xác định chiều dài của chuỗi (và có thể là chiều cao của nó) từ một chuỗi/kết hợp phông chữ (tôi sử dụng điều này trong UIKit, đã sử dụng tương đương trong Cocoa, nhưng nó đã được một thời ...)

  • một trong phương thức của chế độ xem sẽ là 'tính toán'. Khi bạn nhận được điều này, hãy bí mật chuỗi thành một mảng các từ bằng cách sử dụng một dấu cách đơn lẻ làm dấu phân cách (hoặc làm cho nó phức tạp hơn). Sau đó, bắt đầu tính toán chiều dài của chuỗi được rút ra, lấy tác phẩm đầu tiên, nối thêm một khoảng trắng và thứ hai, v.v. cho đến khi bạn thấy bạn đã vượt quá chiều rộng của nó. Đây là chuỗi đầu tiên của bạn.

  • tiếp tục thực hiện việc này cho số dòng mà bạn muốn vẽ (2? 3?). Tính toán độ dài của char unicode mà ... - dấu chấm phẩy tùy chọn của nó khi tôi nhớ lại - và giữ nó xung quanh.

  • ở dòng cuối cùng, tiếp tục thêm từ cho đến khi bạn vượt quá độ dài và sau đó sao lưu từng từ, xác minh chuỗi chuỗi được nối thêm cuối cùng (trừ dấu cách) nhưng với '...' char sẽ phù hợp trong không gian.

  • bạn có thể làm fancier này bằng cách thêm đệm xung quanh biên giới vv

  • khi tính toán xong (và bạn tất nhiên bộ nhớ cache tất cả các bit của câu trả lời), tầm nhìn của bạn được chuẩn bị khi nó được ' drawRect: ... '. Bạn đặt tại (0, bounds.size.height - 21) và vẽ đoạn đầu tiên, sau đó di chuyển xuống 21 điểm và vẽ dòng thứ hai, v.v.

Nếu tôi viết mã này, tôi sẽ lên kế hoạch 2-4 giờ - nó không tầm thường, có lẽ logic là một chút phức tạp, nhưng nó đơn giản. Chúc may mắn!

+1

NSTextView không có ô - nghĩa là NSTextField phải không? – Vervious

+0

Quyền - Tôi cập nhật văn bản của mình để phản ánh lỗi đánh máy của tôi - cảm ơn và mũi tên lên :-) –

+0

Ok, +1 cho câu trả lời của bạn ngay bây giờ! – Vervious

3

Mặc dù câu trả lời đúng không được chấp nhận trong câu hỏi cũ này - di chuyển đến câu trả lời cuối cùng - nó bao gồm mã Truncate the last line of multi-line NSTextField

Các giải pháp bao gồm việc sử dụng các hình elip và ngắt dòng cộng lại.