2013-09-11 29 views
25

Tôi có UISegmentedControl trong ứng dụng của mình. Kể từ iOS7 GM, hình ảnh tôi sử dụng không hiển thị khi chạy trên thiết bị iOS7. Bất cứ ai khác có vấn đề này?UISegmentedControl setImage: Bug trong iOS7

Đây là giao diện trong iOS6.1 và trước đó là iOS6-ScreenShot.

và đây là giao diện trong iOS7 iOS7-ScreenShot.

Đây là mã:

self.theSegmentedControl.frame = CGRectMake(self.theSegmentedControl.frame.origin.x, self.theSegmentedControl.frame.origin.y, 320, 35); 
[self.theSegmentedControl setBackgroundImage:[UIImage imageNamed:@"img_toggleInactive"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_onceActive"] forSegmentAtIndex:0]; 
[self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_recurringInactive"] forSegmentAtIndex:1]; 
[self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_scheduledInactive"] forSegmentAtIndex:2]; 
[self.theSegmentedControl setDividerImage:[UIImage imageNamed:@"separator"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

Có ai tìm thấy một cách giải quyết này?

+0

nó không phải là một nhưng, đó là một tính năng! Apple đã thực hiện lựa chọn rất kỳ lạ để tô màu hoàn toàn hình ảnh trong các điều khiển phân đoạn của mình. Tôi ứng dụng của tôi tôi đã sử dụng một seg để chọn một màu sắc, bây giờ màu sắc của tôi là tất cả các màu xanh! – Martin

Trả lời

61

Woohoo! Đây là cách giải quyết:

//Add clear color to mask any bits of a selection state that the object might show around the images 
self.theSegmentedControl.tintColor = [UIColor clearColor]; 

UIImage *onceActive; 
UIImage *recurringActive; 
UIImage *scheduledActive; 
UIImage *separator; 

//Setting imageWithRenderingMode: to imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal for iOS7 is key 
if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) { 
    onceActive = [[UIImage imageNamed:@"btn_onceActive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
    recurringActive = [[UIImage imageNamed:@"btn_recurringInactive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
    scheduledActive = [[UIImage imageNamed:@"btn_scheduledInactive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
    separator = [[UIImage imageNamed:@"separator"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 

} 
else { 
    onceActive = [UIImage imageNamed:@"btn_onceActive"]; 
    recurringActive = [UIImage imageNamed:@"btn_recurringInactive"]; 
    scheduledActive = [UIImage imageNamed:@"btn_scheduledInactive"]; 
    separator = [UIImage imageNamed:@"separator"]; 
} 


[self.theSegmentedControl setImage:onceActive forSegmentAtIndex:0]; 
[self.theSegmentedControl setImage:recurringActive forSegmentAtIndex:1]; 
[self.theSegmentedControl setImage:scheduledActive forSegmentAtIndex:2]; 
[self.theSegmentedControl setDividerImage:separator forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
+2

Đó không phải là 'cách giải quyết', nó được gọi rõ ràng trong một trong các video WWDC như một điều cần thiết để làm trong trường hợp đó – Petesh

+25

Mã không có phương pháp mới hoạt động trong iOS6.1 trở xuống và dừng lại ở 7. Không có dấu hiệu nào trong tài liệu hoặc bảng điều khiển để làm bất kỳ điều gì khác. Các trách nhiệm không nằm trên tôi để xem tất cả các video WWDC. Tôi sẽ tiếp tục và gọi đây là một lỗi, cảm ơn bạn. – kevmalek

+2

Bạn đã biên dịch lại mã của mình bằng SDK mới chưa? Các tài liệu * nêu rõ * rằng: Các biểu tượng phân đoạn Bạn có thể sử dụng hình ảnh thay vì văn bản tiêu đề cho phân đoạn của mình. Lưu ý rằng hình ảnh phân khúc sẽ tự động được hiển thị dưới dạng hình ảnh mẫu trong một điều khiển được phân đoạn, trừ khi bạn đặt chế độ hiển thị của nó thành UIImageRenderingModeAlwaysOriginal. Để biết thêm thông tin, hãy xem Hình ảnh mẫu (Tôi không liên kết với nó vì liên kết vẫn đang được phát hành trước) – Petesh

17

CẬP NHẬT cho Xcode 6/iOS 8

Bây giờ bạn có thể làm điều đó trong giao diện người xây dựng

Chỉ cần thêm các tập tin hình ảnh trong danh mục tài sản và thiết lập "render của nó là" ảnh gốc thay vì mặc định

Xcode 5

Điều khiển UISegmented mới sử dụng tông màu để tô màu ảnh bằng chế độ mẫu. Bạn sẽ cần phải hiển thị những hình ảnh này dưới dạng bản gốc chứ không phải mẫu.

Như đã đề cập trong các ý kiến ​​làm điều này:

UIImage* onceActive = [UIImage imageNamed:@"btn_onceActive"]; 
if (IOS_7_MACRO) 
    onceActive = [onceActive imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
[self.theSegmentedControl setImage:onceActive forSegmentAtIndex:0]; 
+0

Làm thế nào để bạn cho nó biết để sử dụng chế độ Rendering AlwaysOriginal từ XIB/Interface Builder? – user282172

+2

Tôi không thấy tùy chọn đó trong IB ít nhất là cho UISegmentedControl: ( –

+1

Kể từ Xcode 6, bạn có thể đặt chế độ hiển thị trong thuộc tính danh mục tài sản cho mỗi nội dung: D –

2

Nó có thể là hữu ích để tạo ra một thể loại:

@interface UISegmentedControl (UISegmentedControlAdditions) 
    -(void)setImageRenderingMode:(UIImageRenderingMode)renderingMode; 
@end  

@implementation UISegmentedControl (UISegmentedControlAdditions) 
    -(void)setImageRenderingMode:(UIImageRenderingMode)renderingMode { 
     for (int index=0; index < [self numberOfSegments]; index++) { 
      UIImage * image = [self imageForSegmentAtIndex:index]; 
      [self setImage:[image imageWithRenderingMode:renderingMode] forSegmentAtIndex:index]; 
     } 
    } 

... và chỉ cần gọi

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) 
    [colorSegmentedControl setImageRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
+0

'imageWithRenderingMode:' đã có mặt trong 'UIImage'. Sau đó, tại sao tạo danh mục? Chỉ có sẵn trong iOS 7.0 trở đi –

+0

Có,' imageWithRenderingMode: ' cũng là một phương thức 'UIImage': ví dụ này đang sử dụng nó Tại sao tạo một thể loại? Bởi vì nó ít tiết và hữu dụng hơn việc cấu hình các điều khiển của bạn theo cách thủ công. Nhưng tất nhiên, nó thậm chí còn tốt hơn bằng cách tạo ra lớp 'UISegmentedControl' của riêng bạn. – Martin

7

Sử dụng này Mã để đặt Hình ảnh trên Kiểm soát phân đoạn trong iOS 7 với xCode 5.0

if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) { 

    [segmentControl setImage:[[UIImage imageNamed:@"image.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forSegmentAtIndex:0]; 

} 
else { 
    [segmentControl setImage:[UIImage imageNamed:@"image.png"] forSegmentAtIndex:0]; 
}