IOS、カスタムSelectionIndicatorをUIPickerViewに追加する方法は?

iphone objective-c uipickerview
IOS、カスタムSelectionIndicatorをUIPickerViewに追加する方法は?

UIPickerViewのデフォルトのSelectionIndicatorの代わりにチェックマークを追加したい。

image:https://i.stack.imgur.com/vYmaZ.png [ここに画像の説明を入力]

サブビューとして画像を追加しようとしています

 UIImageView * checkMark = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 102, 13, 13)] autorelease];
[checkMark setImage:[UIImage imageNamed:@"pickerChechmark.png"]];
checkMark.layer.borderColor = [[UIColor redColor] CGColor];
checkMark.layer.borderWidth = 2;
 [picker addSubview:checkMark];

ただし、ピッカーの背後に追加されているのは、次の画像です。

image:https://i.stack.imgur.com/Vp61b.png [for x = 0] image:https://i.stack.imgur.com/OXtMS.png [for x = 5] image:https: //i.stack.imgur.com/QoxnC.png [ここに画像の説明を入力]

x = 0の画像1、x = 5の画像2、x = 10の画像3(チェックマークのx位置)は、私の質問の明確化のために、左上の赤い長方形も参照してください

UIView * redblock = [[[UIView alloc] initWithFrame:CGRectMake(0, -20, 50, 40)] autorelease];
redblock.backgroundColor = [UIColor redColor];
[picker addSubview:redblock];
[picker bringSubviewToFront:redblock];

これをどのように修正しますか?

  4  0


ベストアンサー

また、選択インジケーターをカスタマイズする必要がありました。ピッカーには、標準インジケーターよりも高いカスタムビュー(テーブルビューのセルに似ています)を入力するためです。

作成時にUIPickerViewにスーパーインポーズする半透明のビューを指定する最初の試みは、同じ結果につながりました。 トレース中に、作成時にピッカービューにサブビューがまだないことに気付きました。これはおそらく、カスタム選択インジケーターが視覚的階層の後ろに送信される理由です。

私の解決策は、デリゲートメソッド_pickerView:viewForRow:forComponent:reusingView:_が初めて呼び出されたときに、選択インジケーターのカスタムビューを指定することです。 その時点で、UIPickerViewはすべてのサブビューで準備が整い、新しいカスタムビューが残りの上に適切に追加されます。 コンテンツにカスタムビューを使用する必要がない場合は、他のデータソースメソッド_pickerView:titleForRow:forComponent:_を使用しても同じことができます。

次のスニペットは私のソリューションを示しています。

注:デリゲートメソッドが複数のUIPickerViewを提供する場合、フラグを異なる方法で処理する必要があります。 SLPickerCellは、独自のセルクラスであり、UIViewサブクラスです。

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    SLPickerCell        *pickerCell = nil;
    NSArray             *topLevelObjects;
    const CGFloat       kPickerBorderSize = 10;
    const CGFloat       kIndicatorVerticalMargin = 2;

    // if this is the first time we enter the function, add selection indicator view on top of everything else
    if ( ![self pickerSelectionIndicatorInstalled] )
    {
        UIView          *customSelectionIndicator;
        CGRect          selectionIndicatorFrame;
        CGRect          pickerViewFrame;

        pickerViewFrame = [pickerView frame];

        // Create and add a custom selection indicator (a superimposed semi-transparent view)
        // Use the cell height as reference for the height of the indicator
        selectionIndicatorFrame = CGRectMake(kPickerBorderSize, (pickerViewFrame.size.height - ( [SLPickerCell height] + kIndicatorVerticalMargin )) / 2, pickerViewFrame.size.width - (2 * kPickerBorderSize), ( [SLPickerCell height] + kIndicatorVerticalMargin ));

        customSelectionIndicator = [[UIView alloc] initWithFrame:selectionIndicatorFrame];
        [customSelectionIndicator setUserInteractionEnabled:NO];
        [customSelectionIndicator setAlpha:0.25];
        [customSelectionIndicator setBackgroundColor:[UIColor lightGrayColor]];
        [[customSelectionIndicator layer]setBorderWidth:1.0];
        [[customSelectionIndicator layer]setBorderColor:[[UIColor darkGrayColor]CGColor]];

        // Add the indicator on top of the picker
        [pickerView addSubview:customSelectionIndicator];

        // set the flag; remember to reset it upon creation of a new UIPickerView
        [self setPickerSelectionIndicatorInstalled:YES];
    }
    // [...]

3


このコードを試して、ピッカービューにチェックマークとラベルを追加しました

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

    UIView *pickerviewtemp=[[UIView alloc] initWithFrame:CGRectZero];

    UILabel *lbl=[[UILabel alloc] initWithFrame:CGRectMake(-105, -15, 240, 30)];
    [lbl setBackgroundColor:[UIColor clearColor]];
    [lbl setText:[self.folderNameArray objectAtIndex:row]];
    [lbl setFont:[UIFont boldSystemFontOfSize:20]];
    [pickerviewtemp addSubview:lbl];
    UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(-130, -5, 15, 15)];
if ([self.folderCheckArray containsObject:[NSString stringWithFormat:@"%d",row]]) {
        [imgView setImage:[UIImage imageNamed:@"tick.png"]];
    }
    else {
        [imgView setImage:nil];
    }

    [pickerviewtemp addSubview:imgView];
    return pickerviewtemp;
}

1


このように表示するには、チェックマークを追加してみてください。

[self.view addSubview:checkMark];

座標をいじる必要がありますが、ピッカービューで表示できるはずです。

0


タイトルとURLをコピーしました