2011-11-25 38 views
14

Tôi muốn ghi đè các biểu tượng cảm xúc bằng đồ họa tùy chỉnh của riêng tôi (chỉ trong ứng dụng của tôi).Ghi đè Đồ họa Biểu tượng cảm xúc

Từ những gì tôi đã đọc cho đến nay, một giải pháp khả thi là tạo tiện ích phông chữ tùy chỉnh ghi đè các ký tự unicode mong muốn. Ưu tiên tôi muốn duy trì khả năng tương tác với CATextLayer.

Chỉnh sửa: Có vẻ như phông chữ tùy chỉnh sẽ không phải là giải pháp của tôi; phông chữ phải được xác định theo thang màu xám. Khả năng tiếp theo: Tạo một CALayer tùy chỉnh, chia chuỗi thành các phân đoạn dựa trên mã biểu tượng cảm xúc và thực hiện cài đặt kiểu + vẽ đồ họa theo cách thủ công (ví dụ: đồ họa lõi và văn bản lõi)

Chỉnh sửa: Đồng thời tìm cách duy trì hiệu suất cuộn mượt mà một cái nhìn bảng.

+0

Có thể điều này sẽ giúp bạn - http://stackoverflow.com/questions/1225514/making-an-emoji-enabeling-app – Sagar

Trả lời

2

Tôi đã dành rất nhiều thời gian để cố gắng làm tương tự. Đặt cược tốt nhất của bạn là thay thế các giá trị unicode cho biểu tượng cảm xúc trong ví dụ NSString của bạn. \ uE100 v.v. với chuỗi giữ chỗ. Bạn có thể thay thế mã hóa biểu tượng cảm xúc bằng Thẻ HTML và sử dụng UIWenViews hoặc DTCoreText để vẽ hình ảnh nội tuyến. Tôi đã làm điều này, nó hoạt động quá, nhưng nó sẽ là một chút chậm

Đây là một khởi đầu nhỏ (đặc biệt nếu bạn muốn hiển thị Label này trong quan điểm bảng.):

Tạo một từ điển với UIImages làm đối tượng và chuỗi giữ chỗ làm khóa:

 self.emoticonDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"happyEmoticon.png", @":)", 
         @"sadEmoticon.png",  @":(", 
         @"testImg.png",   @"\uE100", 
         nil]; 


__block NSString *text1 = [NSString stringWithFormat:@"<html><p>%@</p></html>",text]; 
    [self.emoticonDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) { 
     text1 = [text1 stringByReplacingOccurrencesOfString:key withString:[NSString stringWithFormat:@"<img height= 15 width= 15 src=\"%@\">",obj]]; 
    }]; 

Bạn có thể tải HTML này vào UIWebView và bạn sẽ có những gì bạn muốn.

[myWebView loadData:_htmlData MIMEType:@"text/html" textEncodingName:@"utf-8" baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];//do create the webview first 

Nếu tốc độ chậm của UIWebView là mối quan ngại, bạn có thể đọc tiếp. Trong cả hai trường hợp, hãy xem ghi chú ở cuối câu trả lời này.

Để tạo một DTAttributedLabel, chúng ta thực hiện như sau: Đầu tiên chúng ta xây dựng một NSattributedString sử dụng DTHTMLAttributedStringBuilder:

NSAttributedString *temp = [[[DTHTMLAttributedStringBuilder alloc] initWithHTML:text1 
                options:@{ 
            DTDefaultFontFamily: @"Helvetica", 
            DTDefaultFontSize:@15,}; 
            documentAttributes:nil] 
            generatedAttributedString]; 

Sau đó, bạn có thể sử dụng một trường hợp DTAttributedLabel để hiển thị temp.

self.tempLabel.attributedString = temp;//create a DTAttributedLabel Instance called tempLabel before this, I had it as a property 

Mục tiêu của tôi là tạo nhãn văn bản thật nhanh (Bảng lượt xem) trong khi hỗ trợ biểu tượng cảm xúc tùy chỉnh. DTAttributedLabels nhanh (nhanh hơn nhiều so với UIWebView) LƯU Ý: Tôi cũng đã tạo phông chữ tùy chỉnh nơi tôi đã ánh xạ các giá trị unicode cho biểu tượng cảm xúc thành hình tượng tùy chỉnh. Trước sự ngạc nhiên của tôi, các biểu tượng cảm xúc mặc định được hiển thị. Tôi muốn tuyên bố ở đây rằng bất cứ khi nào iOS (CoreText) đi qua một nhân vật có giá trị nằm trong phần Emoji, nó vẽ nó bằng cách sử dụng phông AppleColorEmoji theo mặc định.Việc thiếu tài liệu về cách thức Apple Color Emoji font thực sự được vẽ trên iOS thực sự làm cho nó khó khăn cho tôi để chứng minh điều này, nhưng điều này có vẻ là một lời giải thích hợp lý. Nếu bạn thả biểu tượng cảm xúc từ ứng dụng bảng ký tự vào một tệp trong văn bảnChỉnh sửa, sau đó chọn nó và cố gắng thay đổi phông chữ, bạn sẽ thấy nó không xảy ra. Tương tự, nếu bạn gõ một số văn bản, sau đó chọn nó và cố gắng thay đổi phông chữ của nó thành Apple Color Emoji, bạn sẽ thấy nó không xảy ra. Khi tôi giải mã phông chữ Apple Color Emoji, tôi không tìm thấy các ánh xạ ký tự hoặc ký tự đại diện cho các ký tự văn bản (trừ 0-9). Bằng cách nào đó, ngay cả khi bạn đặt phông chữ của nhãn là Apple Color Emoji, phông chữ cho phần văn bản (không phải biểu tượng cảm xúc) của văn bản nhãn của bạn được đặt thành văn bản khác.

Vui lòng bình luận và chia sẻ kiến ​​thức của bạn vì vùng này xung quanh phông chữ Biểu tượng cảm xúc màu Apple vẫn còn rất không rõ ràng.

+0

Tuyệt vời. Đã lâu rồi kể từ khi tôi chạm vào vấn đề này và chưa hoạt động trên iOS trong nhiều tháng. Nhưng bạn đã có upvote của tôi! – lorean

0

Một giải pháp là sử dụng đại biểu UITextField hoặc TextView và lắng nghe ý kiến ​​của người dùng. Khi họ nhập ký tự biểu tượng cảm xúc, hãy bật nội dòng văn bản UIImageView và xóa biểu tượng cảm xúc bằng đầu vào.

+0

Cảm ơn bạn đã đề xuất. Thật không may, trong trường hợp của tôi, tôi cần phải tránh sử dụng các đối tượng UIKit, vì chúng bị hiệu ứng cuộn lộn xộn. – lorean

+0

@lorean Nếu bạn đang nhận được các vấn đề về hiệu suất cuộn chỉ từ việc bao gồm một vài UIViews thì có thể bạn đang làm điều gì đó không được khuyến khích, như chỉnh sửa phần mềm sao lưu CALayer. Bạn có thể xây dựng? –

+0

Xin chào Conrad. Tôi đã thực hiện thử nghiệm mở rộng bằng cách sử dụng UIViews trong tableCells. Tôi không bao giờ có thể nhận được các tế bào bảng để di chuyển hoàn hảo thông suốt. Sẽ luôn có khung bỏ qua và đôi khi tỷ lệ khung hình chung thấp. Những gì tôi làm là thu hẹp phân cấp khung nhìn thành một drawRect :, hoặc gần đây hơn là tạo thành phần của CALayers. Nếu bạn có một số mã mẫu của một tableViewCell phức tạp được xây dựng hoàn toàn của UIViews với hiệu suất cuộn tuyệt vời, tôi thực sự muốn nhìn thấy nó! – lorean

0

Có một vài đề cập về vấn đề này trên devforums riêng của Apple (mà bạn có quyền truy cập nếu bạn là thành viên đã đăng ký của chương trình nhà phát triển iOS).

Có vẻ như giải pháp tiềm năng sẽ đặt phông chữ rõ ràng cho bất kỳ nội dung nào bạn đang cố gắng hiển thị.

+0

Tôi có quyền truy cập vào các diễn đàn, nhưng không thể tìm thấy bất kỳ điều gì. Ngay cả khi tìm kiếm biểu tượng cảm xúc cũng trả về kết quả tìm kiếm không. – lorean

+0

Một số liên kết có thể hữu ích, @Michael? – Emil

+0

Xin chào @Emil ... [đây là một] (https://devforums.apple.com/message/531811#531811) (vài câu trả lời đầu tiên trong chuỗi đó nói về cách đặt phông chữ); Tôi tự hỏi nếu cờ plist 'KeyboardEmojiEverywhere' sẽ hoạt động trong phạm vi một ứng dụng duy nhất? Nếu không, tôi khuyên bạn nên gửi yêu cầu tính năng tại bugreporter.apple.com. –

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