2010-08-09 35 views
13

Tôi đặt một hình ảnh play.png vào chế độ xem của tôi. Khi khung nhìn ban đầu tải, iPhone 4 lấy tệp [email protected] tương ứng và nó trông rất tuyệt. Tuy nhiên, khi tôi nhấn vào nút phát, mã của tôi hoán đổi nó cho tệp pause.png. Sau đó, khi tôi chạm vào pause.png để quay lại play.png, nó sử dụng tệp play.png gốc (không phải là phiên bản @ 2x như tôi nghĩ nó sẽ tự động tham chiếu).Biểu tượng võng mạc (@ 2x) không được sử dụng khi hình ảnh được chỉ định trong mã

Đây là mã tôi đã cố gắng để sử dụng:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 

Vì vậy, nếu tôi trao đổi tập tin sau khi tải xem ban đầu, tôi phải tự xác định phiên bản @ 2x bên trong một tuyên bố NẾU? Nếu vậy, UIScreen.scale có thuộc tính tốt nhất để sử dụng cho điều này không?

Tôi hiện đang sử dụng mã như thế này:

if ([UIScreen mainScreen].scale > 1.0) 
{ 
    [button setImage:[UIImage imageNamed:@"[email protected]"] forState:UIControlStateNormal]; 
} 
else 
{ 
    [button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 
} 

Nó làm việc tốt nhưng có báo cáo kết quả NẾU trong đó là gây phiền nhiễu và dường như một chút mong manh.

Cảm ơn trước cho tất cả các bạn thông minh ra khỏi đó.

+1

Vui lòng đăng cách hoán đổi hình ảnh ... 'Hình ảnh UIImageNamed' thường xử lý tự động trong khi các phương pháp khác không (chưa) – iwasrobbed

+0

[button setImage: [UIImage imageNamed: @ "play.png"] forState: UIControlStateNormal]; – nicjohnson

+0

bây giờ tôi đang sử dụng những điều sau (xin lỗi, tôi không thể tìm ra cách định dạng mã như mã): nếu ([màn hình chính của UIScreen .scale> 1.0) { \t [button setImage: [UIImage imageNamed: @ "[email protected]"] forState: UIControlStateNormal]; } else { \t [nút setImage: [UIImage imageNamed: @ "play.png"] forState: UIControlStateNormal]; } Nó hoạt động tốt nhưng có tuyên bố IF trong đó là gây phiền nhiễu và có vẻ hơi mong manh. – nicjohnson

Trả lời

2

Tôi có thể khẳng định rằng đây là một vấn đề với các thiết bị 4.0. Vấn đề không phải là nó không tải hình ảnh @ 2x, nó thực sự, nhưng vẫn hiển thị nó ở 72 DPI (làm cho nó bị mờ).

Lỗi này được may mắn thay trong 4.1 (được thử nghiệm trong trình mô phỏng).

25

Câu lệnh điều kiện là không cần thiết. Các dòng sau là đủ:

[button setImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal]; 

Trong iOS 4.0, các imageNamed: Phương pháp tự động tìm kiếm các "@ 2x" filename hậu tố nếu thiết bị là một chiếc iPhone 4 và có màn hình hiển thị võng mạc. Trong các phiên bản trước của hệ điều hành iPhone, phương thức imageNamed: chỉ tìm kiếm những gì bạn viết (tức là hình ảnh có độ phân giải thấp hơn). Điều này làm việc vì iPhone 4 không thể có một phiên bản hệ điều hành thấp hơn sau đó 4.0, vì vậy người dùng màn hình võng mạc của bạn sẽ luôn luôn có tác phẩm nghệ thuật có độ phân giải cao hơn.

+0

Bạn sẽ nhận thấy từ bài viết đầu tiên của tôi rằng dòng mã bạn đã cung cấp cho tôi chính xác là những gì tôi đang sử dụng. Ban đầu nó tải phiên bản võng mạc của biểu tượng phát, nhưng khi tôi nhấn vào nó và đổi nó với pause.png rồi quay lại play.png, nó sẽ sử dụng phiên bản low-res của play.png. – nicjohnson

+1

Thật không may, mã bạn mô tả sẽ hoạt động tốt, vì vậy tôi nghĩ rằng vấn đề là ở một nơi khác trong dự án của bạn. Tôi chỉ cần thực hiện một nút với hai hình ảnh và trên mỗi nhấp chuột nó chuyển đổi; hoạt động tốt.Bạn có thể đăng tất cả mã liên quan đến nút này không? –

1

Một người nào đó trên một chuỗi khác đã đề cập rằng họ đã giải quyết được vấn đề vexing tương tự bằng cách xóa và thêm lại hình ảnh có độ phân giải cao của họ vào dự án.

4

Hai sai lầm ngớ ngẩn (cả hai mà tôi đã thực hiện trước đó) có thể gây ra vấn đề này:

  1. Vô tình đặt tên cho các phiên bản nhỏ @ 2x thay vì những người lớn
  2. Có các phiên bản lớn là bị bỏ qua một chút (một pixel)
7

Bạn có thể sử dụng chỉ:

[UIImage imageNamed:@"play"] 

Không có phần mở rộng. Thao tác này sẽ tải phiên bản @ 2x nếu có và nếu thiết bị có thang đo x2.

Thao tác này sẽ hoạt động đối với iOS4 hoặc máy vắt.Tuy nhiên nếu bạn muốn chạy ứng dụng của bạn trong các phiên bản trước, bạn có thể làm như sau:

UIImage* image = [UIImage imageNamed:@"play"]; // for iOS 4 or greater 
if(!image) 
    image = [UIImage imageNamed:@"play.png"]; // for previous iOS versions 

Lợi ích là điều này sẽ làm việc nếu bất cứ lúc nào bạn có @ 3x hoặc bất kỳ phiên bản khác nếu Apple tạo ra thiết bị mới hoặc hiển thị .

Bạn có thể tạo phương thức tiện ích để tránh làm điều này ở mọi nơi bạn cần tải hình ảnh.

Xem: Supporting High-Resolution Screens, phần "Đang nạp hình ảnh vào ứng dụng của bạn"

+0

Tầm nhìn xa! I E. iPhone 6 Plus và @ 3x :) –

0

Tôi có vấn đề tương tự vì tên tệp - button_slice9.png và [email protected] không hoạt động.

Nhưng button_slice.png và [email protected] hoạt động như mong đợi trong imageNamed :.

0

Tôi vừa gặp sự cố tương tự mất một lúc để tìm ra. Nó chỉ ra rằng hình ảnh @ 2x của tôi bằng cách nào đó không được thêm vào mục tiêu ứng dụng của tôi, vì vậy chúng không được đóng gói.

0

Tôi gặp sự cố tương tự khi tôi thay thế biểu tượng có độ phân giải thấp-close.png bằng biểu tượng độ phân giải [email protected] Các bản dựng iPad dường như bỏ qua "@ 2x" và tải hình ảnh ở kích thước gấp đôi với tỷ lệ = 1,0. Việc xóa tệp và thêm lại không giúp ích gì. Đổi tên nó thành "[email protected]" đã làm. Một số thông tin xấu được lưu trong bộ nhớ cache ở đâu đó về icon-close.png

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