2013-09-22 19 views
7

Dường như UIPickerView không còn hỗ trợ sử dụng NSAttributedString cho các mục xem bộ chọn. bất cứ ai có thể xác nhận điều này? Tôi đã tìm thấy NS_AVAILABLE_IOS(6_0) trong tệp UIPickerView.h, nhưng đây có phải là vấn đề không? Có cách nào để giải quyết vấn đề này không, hoặc tôi có may mắn không?UIPickerView: NSAttributedString không khả dụng trong iOS 7?

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component; 
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component NS_AVAILABLE_IOS(6_0); // attributed title is favored if both methods are implemented 
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view; 
+1

Điều gì sẽ xảy ra khi bạn cung cấp chuỗi được phân bổ? Làm thế nào nó không được hỗ trợ? – Wain

+1

Lời xin lỗi của tôi có lẽ tôi đã đề cập đến điều này. Nó chạy hoàn toàn tốt, nhưng pickerView không hiển thị nó với các phông chữ được chỉ định trên iOS 7. Nó CHỈ sử dụng mặc định của hệ thống. Trên iOS 6, điều này sẽ hiển thị trong phông chữ mà nó được cho là. – Rob

+1

Bạn đã thử trả lại nhãn có văn bản được phân bổ làm phương pháp thay thế chưa? – Wain

Trả lời

13

Giải pháp duy nhất cho vấn đề này rõ ràng là sử dụng pickerView:viewForRow:forComponent:reusingView: và trả lại UILabel với văn bản được phân bổ vì Apple rõ ràng đã tắt bằng cách sử dụng các chuỗi được phân bổ theo cách khác.

+1

Vấn đề duy nhất với cách tiếp cận này là các khung nhìn trong khung nhìn bộ chọn không nhận được hiệu ứng zoom đẹp khi được chọn nhưng các chuỗi làm. – Indoor

+0

Tôi đồng ý và tôi không chắc chắn có thực sự là một cách để thực hiện nó cho mình. Đó là một vấn đề không may với Apple phá vỡ mã riêng của họ một lần nữa. – Rob

7

Rob là đúng, lỗi hay không là cách dễ nhất để có được văn bản được phân bổ trong UIPickerView trong iOS 7 là để hack phương thức pickView: viewForRow: forComponent: reusingView:. Đây là những gì tôi đã làm ...

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 
{ 
    // create attributed string 
    NSString *yourString = @"a string"; //can also use array[row] to get string 
    NSDictionary *attributeDict = @{NSForegroundColorAttributeName : [UIColor whiteColor]}; 
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:yourString attributes:attributeDict]; 

    // add the string to a label's attributedText property 
    UILabel *labelView = [[UILabel alloc] init]; 
    labelView.attributedText = attributedString; 

    // return the label 
    return labelView; 
} 

Có vẻ tuyệt vời trên iOS 7, nhưng trong iOS 6 nền mặc định là màu trắng để bạn không thể thấy văn bản màu trắng của mình. Tôi khuyên bạn nên kiểm tra phiên bản iOS và triển khai các thuộc tính khác nhau dựa trên từng thuộc tính.

+1

https://github.com/erica/iOS-6-Advanced-Cookbook/tree/master/C01%20-%20Device/02%20-%20UIDevice-Hardware Đây là thư viện tốt để sử dụng để kiểm tra về mọi thứ về thiết bị. Grab UIDevice-Hardware.h – Rob

4

Dưới đây là ví dụ về cách sử dụng bộ chọnXem: viewForRow: forComponent: reusingView: theo cách tôn vinh chế độ xem được tái chế.

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UILabel *)recycledLabel { 
    UILabel *label = recycledLabel; 
    if (!label) { // Make a new label if necessary. 
     label = [[UILabel alloc] init]; 
     label.backgroundColor = [UIColor clearColor]; 
     label.textAlignment = NSTextAlignmentCenter; 
    } 
    label.text = [self myPickerTitleForRow:row forComponent:component]; 
    return label; 
}