web-dev-qa-db-ja.com

iOS10でUIPickerView選択インジケーターが表示されない

Xcode 8でプロジェクトをビルドします。UIPickerViewセパレーター線はiOS 10シミュレーターとデバイスでは表示されませんが、iOS 9.3デバイスとシミュレーターでは正常に動作します。 UIPickerViewの背景色、自動レイアウト、XIBで可能なすべてを調整しようとしましたが、何も機能しません。誰かこれについて考えがありますか?

これは、UIPickerViewを含むカスタムビューです。

enter image description here

-(void)layoutSubviews{
isShown = NO;
[super layoutSubviews];

//self.selectedDic = nil;

self.doneBtn.tintColor = COLOR_DB3535;
self.pickerView.backgroundColor = COLOR_DEDEDE;
self.pickerView.showsSelectionIndicator = YES;

[self.doneBtn setTitle:NSLocalizedString(@"App_Generic_Button_Text_Done", @"")];
}


-(UIView*)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
label.tintColor = [UIColor clearColor];
label.backgroundColor = [UIColor yellowColor];
label.textColor = COLOR_666;
label.font = [FontsManager getFONT_ROBOTO_LIGHT_16];
label.textAlignment = NSTextAlignmentCenter;
NSDictionary *dict = [dataArray objectAtIndex:row];
label.text = @"Test";
return label;
}
15
smartsanja

IOS10向けのソリューションをいくつか再構築し、シミュレーターとデバイスの両方でiOS10に展開したときに、この問題が発生しました。

私の場合、問題を絞り込んで、初期化中にピッカーでアイテムを選択することにまで絞り込みました。すなわち。私はピッカーにデータを入力し、このプロパティの選択をすでに取得している場合は、それを事前選択し、線が表示されます。これは、ピッカーを設定する初期化中に行います。

したがって、私の使用例で機能した私の修正は、既存の値がない場合に0要素を選択することでした。

Objective-C

UIPickerView *pickerView;

...

[pickerView selectRow:0 inComponent:0 animated:YES];

スウィフト

let pickerView: UIPickerView

...

pickerView.selectRow(0, inComponent: 0, animated: true)

セットアップ時に行0を効果的に選択したので、これは私のソリューションでは問題ありませんでした。

私は推論を掘り下げるか、より明確な解決策を探す機会がありませんでしたが、私の問題を解決したので、私はここでそれを共有して、可能であればあなたを助けるためにそれを共有したいと思いました。

35
John Guy
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 320, 200)];
pickerView.backgroundColor = [UIColor whiteColor];
pickerView.dataSource = self;
pickerView.delegate = self;
[pickerView selectRow:0 inComponent:0 animated:YES];
[self.view addSubview:pickerView];

コードを追加[pickerView selectRow:0 inComponent:0 animated:YES]; pickerViewがsuperViewに追加される前。

12
YB.Jiao

私はiOS10でも同じ問題に直面しています。これが私の問題です: enter image description here

そして私はこの問題を次のように解決しました:

 self.pickerView.backgroundColor = COLOR_DEDEDE;
 self.pickerView.showsSelectionIndicator = YES;
    for (UIView *view in self.pickerView.subviews) {
        if (view.bounds.size.height < 2.0f && view.backgroundColor == nil) {
            view.backgroundColor = PICK_Line_COLOR; // line color
        }
    }

注意:

このコードはメソッドの後に呼び出す必要があります:[self.view addSubview:pickeView];

最終結果:

enter image description here

それは私のプロジェクトで動作します。お役に立てば幸いです。

5
ocarol

あなたが話している「区切り線」が何であるかわかりません。 iOS 9にも「区切り線」は表示されません。

スクリーンショットにない唯一の「線」は選択インジケーターです。ピッカービューのshowsSelectionIndicatorYESに設定することで取得できます。しかし、そうする必要はありません。選択インジケータの表示がデフォルトです。ドキュメントは言う:

IOS 7以降...選択インジケーターは常に表示されます

enter image description here

1
matt

UIPickerViewのサブクラスを使用してこの問題を解決しました:

import UIKit

    class FixedPickerView: UIPickerView, UIPickerViewDelegate {

        override func willMove(toSuperview newSuperview: UIView?) {
            self.delegate = self
            self.selectRow(0, inComponent: 0, animated: true)
            self.delegate = nil
            super.willMove(toSuperview: newSuperview)
        }
    }

これは私のコードです:

-(UIView*)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{

    for(UIView *single in pickerView.subviews)
    {
        if (single.frame.size.height < 1)
        {
            single.backgroundColor = [UIColor grayColor];
        }
    }
   //other code

}
1
kingalex