2014-09-23 17 views
24

Tôi đang cố gắng sử dụng hình ảnh có chế độ hiển thị mẫu được bật trong Trình tạo giao diện nhưng tôi không thể làm cho nó hoạt động. Với các nút hoạt động tốt, nhưng với ImageViews, tintColor không áp dụng cho ảnh.Làm cách nào để sử dụng chế độ hiển thị mẫu trong Trình tạo giao diện Xcode 6?

Tôi đã bật "Loại vectơ" (Tôi đang sử dụng pdf) và "Hiển thị dưới dạng hình ảnh mẫu" trong nội dung Hình ảnh. Tôi đang làm gì sai?

+0

Câu hỏi này là một bản sao của [Sửa UIImage renderingMode từ storyboard/file xib] (http://stackoverflow.com/questions/19517334/modify-uiimage-renderingmode-from-storyboard-xib-file) – 0xced

Trả lời

32

Tôi đã gặp sự cố tương tự. Tôi nghi no la một con bọ.

Bạn có thể quét radar này http://openradar.appspot.com/radar?id=5334033567318016, đề cập đến ứng dụng mẫu tối thiểu này https://github.com/algal/TemplateImagesBrokenDemo.

tôi biết hai cách giải quyết cho vấn đề này

bọc trong UIButton

Kể từ tintColor làm việc cho UIButtons, một workaround là thay vì UIImageView chỉ để sử dụng một tùy chỉnh kiểu UIButton với userInteractionEnabled = false. Nếu bạn vô hiệu hóa tương tác của nút với UIView.userInteractionEnabled (như trái ngược với với UIControl.enabled), thì bạn sẽ không thay đổi diện mạo của hình ảnh.

tự tái thiết lập các hình ảnh trong mã

workaround khác là tái thiết lập các .image tài sản trong mã, sau khi UIImageView đã được tải từ ngòi. Điều này làm việc bởi vì việc thiết lập một hình ảnh trong mã có vẻ là những gì gây nên logic khuôn mẫu. Để làm việc này, bạn cần phải thiết lập lại hình ảnh về giá trị hiện tại của nó theo cách không được tối ưu hóa trong trình biên dịch. Một đoạn như thế này trong awakeFromNib đã làm việc cho tôi:

override func awakeFromNib() { 
    super.awakeFromNib() 

    if shouldSetImagesManually { 
    // the following three-lines should in theory have no effect. 
    // but in fact, they ensure that the UIImageView 
    // correctly applies its tintColor to the vector template image 

    let image = self.templateImageView.image 
    self.templateImageView.image = nil 
    self.templateImageView.image = image 
    } 
+1

Vì vậy, nó thực sự là một lỗi. Cảm ơn bạn đã xác nhận. Vâng, đó có thể là một giải pháp thay thế, chỉ lưu ý rằng nút PHẢI KHÔNG được Tùy chỉnh để có được màu tintColor. – rmvz3

+0

Tôi nghĩ bạn có thể sai về điều đó. Trong ứng dụng ví dụ tại liên kết github, nút IS tùy chỉnh và nó nhận được tintColor. – algal

+8

Tôi thấy rằng đủ để gọi 'tintColorDidChange' trên UIImageView. – Jaroslav

11

Trong trường hợp của tôi vấn đề occures nếu ứng dụng được xây dựng với iOS8 SDK và đang chạy trên iOS 7.

workaround của tôi là:

// this is the code that *should* work and does so on iOS 8 
UIColor *tintColor = [UIColor colorWithWhite:1.0 alpha:0.3]; 
[self.iconImageView setTintColor:tintColor]; 
self.iconImageView.image = [self imageForIconImageView]; // image is loaded from a pdf-resource (asset catalog set as Template) with imageNamed:@"resourceName" 

// this is the workaround to get tint on iOS 7  
if (!IS_IOS8_OR_HIGHER) { // macros checking iOS version* 

    UIImage *templateImage = [self.iconImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
    self.iconImageView.image = templateImage; 
} 

// * - macros is defined like so: 
// #define IS_IOS8_OR_HIGHER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 
+0

Tôi có cùng một vấn đề. Tint màu có thể được áp dụng cho một hình ảnh vector trong iOS 8 miễn là chế độ vẽ được thiết lập để 'Luôn luôn mẫu' trong IB hoặc lập trình. Nhưng trong iOS 7, màu tint chỉ hoạt động nếu bản thân hình ảnh được đặt với chế độ hiển thị sau đó được thêm vào chế độ xem hình ảnh. – JimmyJammed

2

Cách giải quyết khác có vẻ phù hợp với tôi là đặt tintColor của controller.view. Để có màu nền hệ thống mặc định hoạt động:

self.view.tintColor = self.view.tintColor; 

Giống như giải pháp của @ tảo, nó không tạo nên sự khác biệt, nhưng nó có thể khác biệt.

4

Đây là giải pháp mã ít đơn giản nhất tôi tìm thấy:

set tintColor in Runtime Attributes

+1

cảm ơn, nó đang hoạt động –

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