Truy cập Danh mục nội dung theo chương trình


96

Tôi biết đó là một tính năng mới và điều này có thể không thực hiện được, nhưng tôi rất muốn có thể sử dụng Danh mục nội dung để sắp xếp nội dung của mình, nhưng tôi truy cập tất cả hình ảnh của mình theo chương trình. Làm cách nào để truy cập hình ảnh của tôi bây giờ? Tôi vẫn truy cập chúng bằng tên tệp của chúng như vậy:

[UIImage imageNamed:@"my-asset-name.png"];

Có vẻ như, Danh mục nội dung không tham chiếu đến tiện ích mở rộng, vì vậy sẽ hiệu quả hơn nếu truy cập nó mà không có ".png"?

Lý do tôi hỏi thay vì tự kiểm tra là ngay cả sau khi xóa nội dung và Danh mục nội dung, sau đó dọn dẹp thư mục xây dựng, tôi vẫn có thể truy cập nội dung của mình trong ứng dụng của mình. Điều này đang ngăn tôi kiểm tra Danh mục nội dung khi tôi triển khai.

Sau khi xem qua Danh mục nội dung, tôi đã tìm thấy "Contents.json" cho từng nội dung và nó được định dạng như vậy:

{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x",
      "filename" : "my-asset@2x.png"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

Tôi vẫn không chắc mình nên truy cập nó như thế nào, nhưng có thể điều này sẽ hữu ích?

Câu trả lời:


138

Để truy cập hình ảnh từ Danh mục nội dung, bạn chỉ cần truy cập vào tên của nhóm nội dung mà không cần bất kỳ phần mở rộng nào.

Vì vậy, nếu bạn thêm một hình ảnh có tên @"my-button@2x.png"vào Danh mục nội dung, nó sẽ tạo một nhóm nội dung được gọi my-button.

Bây giờ, tất cả những gì bạn phải làm là truy cập vào hình ảnh như sau:

// Objective-C
[UIImage imageNamed:@"my-button"];
// Swift
UIImage(named: "my-button")

Ngoài ra, bạn có thể chỉnh sửa nhóm nội dung bằng cách đổi tên nó (không đổi tên hình ảnh) hoặc thay đổi các thành phần riêng lẻ của nó. Điều này sẽ cho phép bạn tuân theo các quy ước đặt tên dễ dàng hơn cũng như hiển thị các nội dung hoàn toàn khác nhau giữa các tên khác nhau UIScreen scalemà không cần scalekiểm tra.

Để kết hợp hình ảnh cho các kích thước thiết bị khác nhau, bạn có thể cần chuyển đổi nó trong tiêu đề phụ "Thiết bị" trong tùy chọn của Nhóm danh mục nội dung. Đây là một ví dụ về chuyển đổi đó (có sẵn bằng cách nhấp chuột phải vào nhóm).


Các phiên bản R4, tức là hỗ trợ 568, ở đó. Nếu bạn xem các thuộc tính của một bộ hình ảnh, bạn có thể chọn 'Device cụ thể' từ thiết bị thả xuống, và sau đó bạn có thể thêm một hình ảnh R4, sẽ xuất hiện trên 4" các thiết bị chạy iOS 7.
bandejapaisa

Có cách nào để truy cập thông tin cắt theo chương trình không? Ngoài việc lấy thuộc tính capInsets từ đối tượng UIImage?
Klaas

@Klaas Tôi không chắc tại sao bạn cần lấy nó bằng bất kỳ phương tiện nào khác ngoài UIImage. Và từ những gì tôi đã thấy, không, vì mỗi Hình ảnh Danh mục trong Nhóm có thể là một hình ảnh hoàn toàn khác nhau, vì vậy sẽ không có bất kỳ thông tin chung nào, chẳng hạn như cắt, có sẵn. Hay tôi đang thiếu cái gì đó?
RileyE

@RileyE Tôi cần thực hiện một số tính toán cho chế độ xem lớp phủ tùy chỉnh và muốn sử dụng cùng các nội dung. Khi tôi chỉ phải tạo một UIImage cho các tính toán của mình, tôi muốn lưu trữ giá trị cần thiết ở một nơi khác (và dư thừa).
Klaas

1
Mã Swift dường như được thay đổi đểUIImage(named: imageName)
HKTonyLee

26

Ngoài ra, Apple đã thêm một cách mới để lấy hình ảnh từ các nội dung với Swift 3, Nó được gọi là 'Image Literal' và hoạt động như bên dưới:

Image Literal


5

Nhanh

Bạn có thể tham chiếu đến một hình ảnh trong catelog nội dung của mình với

UIImage(named: "myImageName")

Bạn không cần phải bao gồm phần mở rộng.


1

@RileyE đúng 100%. Tuy nhiên, từ kinh nghiệm của tôi Cũng cần lưu ý rằng đôi khi tham chiếu danh mục tài sản cho hình ảnh có thể chứa khoảng trắng theo sau. Bạn có thể sẽ không nhận thấy nếu sử dụng bảng phân cảnh / xib vì tự động hoàn thành sẽ thêm nó. Nhưng khi bạn tham chiếu nó từ mã, nó không quá rõ ràng vấn đề là gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.