2008-09-23 33 views
7

Tôi đang trong quá trình thêm các nút tùy chỉnh vào giao diện người dùng iPhone của mình và muốn làm cho chúng có giao diện thủy tinh từ các ứng dụng của Apple. Tôi có một hình ảnh thủy tinh mặc định tốt, nhưng tôi ghét phải có một hình ảnh riêng biệt cho mỗi màu tôi muốn (đỏ, xanh lá cây, xanh dương, v.v.).Làm thế nào để nhuộm một UIButton?

Có cách nào để tải PNG màu xám và điều chỉnh nó theo màu tôi muốn không? Tốt hơn, có cách nào để có được cái nhìn thủy tinh của Apple mà không cần phải tải hình ảnh tùy chỉnh ở tất cả?

Trả lời

2

Không có cách nào một cách mà tôi biết, nhưng bạn có thể có được hiệu ứng mong muốn bằng cách lấy hình ảnh màu xám mặc định và tổng hợp nó với (tức là vẽ nó lên trên) một màu đồng nhất. Nếu bạn xem qua tài liệu Đồ họa cốt lõi, bạn có thể thấy có hơn một tá phương pháp tổng hợp khác nhau (ví dụ: Color Burn) và một số kết hợp chúng có thể tạo ra hiệu ứng bạn muốn.

1

Tôi không biết về giao diện người dùng iPhone, nhưng bạn có thể sử dụng một PNG duy nhất để có đồ họa biến thể màu.

ví dụ: Cả logo (trên cùng bên trái) trên các trang này:

Products

Shops

Sử dụng này PNG

alt text http://47degrees.com/images/logos/47_degrees.png

Tôi cho rằng bạn có thể cần màu nền được đặt làm màu cho thủy tinh.

0

tôi đã kết thúc việc tạo ra nút tùy chỉnh của riêng tôi gần trùng khớp với vẽ sử dụng trong nút "Delete Liên" trong giao diện danh bạ chỉnh sửa.

Đối với những người quan tâm, nó có thể được tìm thấy trên github tại

PFTintedButton

7

Một chút muộn, nhưng trong trường hợp ai đó như tôi tìm kiếm cho các loại hình thông tin: sử dụng một UISegmentedControl với một nút duy nhất, thiết lập nó là momentary và đặt số tintColor. Bằng cách này, không cần chuẩn bị nhiều PNG như bạn có màu sắc và khung công tác sẽ xử lý tất cả hiển thị cho bạn.

Ví dụ:

UISegmentedControl *cancelButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Cancel"]]; 
[cancelButton setSegmentedControlStyle:UISegmentedControlStyleBar]; 
[cancelButton setTintColor:[UIColor colorWithRed:0.8 green:0.3 blue:0.3 alpha:1.0]]; 
[cancelButton setMomentary:YES]; 
[cancelButton addTarget:self action:@selector(didTapCancel:) forControlEvents:UIControlEventValueChanged]; 
[self addSubview:cancelButton]; 
[cancelButton release]; 
+0

Trong khi điều này là tốt đẹp, và tôi đã biết về nó, nó không thực sự làm việc cho tôi vì tôi muốn UIBarButtonItem của tôi để duy trì các thuộc tính màu của thanh công cụ và ngay sau khi bạn giới thiệu một chế độ xem tùy chỉnh với UIButton cửa sổ AFAIK. Tất cả những gì tôi muốn làm là thay đổi màu chữ: ( –

+0

câu trả lời tuyệt vời mà không cần sử dụng png. – andyPaul

+1

Một cách thận trọng: điều này tạo ra một nút không hoạt động giống như nút - nó kích hoạt sự kiện của nó khi người dùng bắt đầu nhấn, thay vì khi chúng phát hành (tức là touchUpInside), thật không may là sự kiện UIControlEventTouchUpInside có vẻ bị nuốt bởi Cocoa, và thêm một mục tiêu vào nó trên một điều khiển phân đoạn không hoạt động. –

0

Tôi đã làm điều này và nó hoạt động khá độc đáo:

iOS: Applying a RGB filter to a greyscale PNG

Tuy nhiên, nó là lừa dối, họ sẽ bổ sung, vì vậy đối với (ví dụ) các thành phần màu đỏ của mỗi pixel, R_dest = R_src + R_tint

Nếu bạn muốn kiểm soát chi tiết, ví dụ: bạn có thể muốn trích xuất giá trị thang độ xám cho từng pixel bằng cách trung bình các thành phần RGB (với trọng số thích hợp), và sau đó nhân giá trị này với màu của bạn, do đó màu kết quả sẽ là màu xám (Sr, Sg, Sb) * {Tr, Tg, Tb}

Điều này sẽ yêu cầu tạo đoạn bộ nhớ, tạo ra một bối cảnh bitmap vẽ vào đoạn này, vẽ hình ảnh của bạn vào bối cảnh này, sao chép toàn bộ bộ nhớ để lưu giữ, xử lý - lấy dữ liệu từ bản sao và sửa đổi cửa hàng sao lưu gốc, sau đó trích xuất một hình ảnh từ cửa hàng sao lưu gốc và giải phóng mọi thứ bạn đã phân bổ.

Problem reconstituting UIImage from RGBA pixel byte data

Thư viện này đã làm tất cả mọi thứ cho bạn, nó không phải là con đường hiệu quả nhất, nhưng nó được công việc làm. iirc anh ta sử dụng malloc khi anh ta nên sử dụng calloc.

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