12

ユニクロの新しい目覚ましアプリにはカスタムがありますUIDatePicker

習慣

そして、私は自分のカスタムを作成したいと思いますUIDatePicker

DatePickerの外観を変更しようとしUI_APPEARANCE_SELECTORましたが、何もUIDatePicker返されません。

ドキュメントによると、値を変更することはできません。

外観のカスタマイズをサポートするには、クラスがUIAppearanceContainerプロトコルに準拠している必要があり、関連するアクセサーメソッドがUI_APPEARANCE_SELECTORでマークされている必要があります。

どうすれば私UIDatePickerの外見を変えることができますか?

4

8 に答える 8

28

APIはこれを行う方法を提供しません。UIDatePickerを使用するのではなく、UIPickerViewを使用して、かなり説得力のあるレプリカを自分で作成できます。

UIDatePickerまたはUIPickerViewにはUI_APPEARANCE_SELECTORがなく、UIControlとしてUIDatePickerコンテンツの外観を変更できず、デリゲートがないため、ネイティブの外観になりますが、UIPickerViewの場合は、コンテンツの外観を次のように変更できます。 UITableViewで。

#pragma mark -
#pragma mark UIPicker Delegate & DataSource

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 2;
}

// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return 100;
}
//- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:  (NSInteger)component {
     //    return [NSString stringWithFormat:@"%d",row];
//}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {

      UILabel *label= [[[UILabel alloc] initWithFrame:CGRectMake(30.0, 0.0, 50.0, 50.0)] autorelease];
      [label setBackgroundColor:[UIColor clearColor]];
      [label setTextColor:[UIColor blueColor]];
      [label setFont:[UIFont boldSystemFontOfSize:40.0]];
      [label setText:[NSString stringWithFormat:@"%d",row]];

      return label;
}

ここに画像の説明を入力してください

これをチェックしてください。

于 2012-07-04T12:34:59.520 に答える
4

このメソッドを実装ファイルに追加します

-(UIView *)pickerViews{

    return ([datePicker.subviews objectAtIndex:0]);
}

-(void)viewDidLoad{

    [super viewDidLoad];

    [[self pickerViews].subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@ --- > %i",obj, idx);
    }];
}

アプリを実行すると、コンソールにdatePickerのすべてのサブビューが表示されます。インデックスを選択して、1つずつ変更するだけです。

viewDidLoadを変更し、このコードを挿入します

UIView *background = (UIView *)[[self pickerViews].subviews objectAtIndex:0];
background.backgroundColor = [UIColor clearColor];

UIView *wheel2 = (UIView *)[[self pickerViews].subviews objectAtIndex:4];
wheel2.backgroundColor = [UIColor redColor];

UIView *wheel3 = (UIView *)[[self pickerViews].subviews objectAtIndex:11];
wheel3.backgroundColor = [UIColor redColor];

この場合、インデックス「0」、「4」、「11」の背景色を変更します

于 2012-07-10T09:43:05.170 に答える
3

iOS 5では、UIAppearanceプロトコルが導入されました。これにより、いくつかのUI要素をカスタマイズできます。UIDatePickerはたまたまこのプロトコルに準拠しているため、これを行う最も簡単な方法です。つまり、iOS5ユーザーのみをサポートする場合です。Matthewのオプションはおそらく次善の策であり、古いiOSバージョンでも機能するはずです。

于 2012-06-01T05:32:16.633 に答える
3

aの表示方法を変更するのは非常に難しいようUIDatePickerです。

私の意見では、あなたが提供した例は、2列の単純なものとおそらくシミュレートされた無限スクロールの洗練されたカスタマイズですUIPickerView(Appleが日付ピッカーで行うように、それは非常に簡単に実現できます)。

この例に示すように、プロキシUIDatePickerを介してほとんど変更することはできません。UIAppearance

UIDatePicker *picker = [UIDatePicker appearance];
picker.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.3];

UIView *view;
view = [UIView appearanceWhenContainedIn:[UITableView class], [UIDatePicker class], nil];
view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];

UILabel *label = [UILabel appearanceWhenContainedIn:[UITableView class], [UIDatePicker class], nil];
label.font = [UIFont systemFontOfSize:[UIFont systemFontSize]];
label.textColor = [UIColor blueColor];

アプリケーションの開始時にこのコードを使用すると(試してみてください)、日付ピッカーの主要コンポーネントのいくつかのアスペクトのみを変更できます。

ラベルをカスタマイズすることは不可能です(そしてこのテストコードはそれを証明しています)。UITableViewカスタムコントローラー内に配置されているため、列を回転させるたびにアスペクトが変更されるようです。

これらの外観を完全に変更するには、おそらくAppleのプライベートAPIを使用する必要があります。これにより、最終的にアプリが拒否されます。

カスタムの時間分ピッカー(スクリーンショットに示されている)が必要な場合は、クラスを拡張するか、インスタンスUIPickerViewに適切なデリゲートを割り当てるだけで、外観を完全にカスタマイズできます。UIPickerView

を通って

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

デリゲートのメソッドを使用すると、ピッカービューの単一の要素を希望どおりに表示できます。次に、ピッカーの2つのコンポーネントを実質的に無限にするために、データソースを適切に処理する必要があります。

于 2012-07-04T13:58:24.600 に答える
0

2つのUIScrollViewを使用して1つを自分で実装できます。1つは時間用、もう1つは分用です。移動が停止したときの各スクロールビューのcontentOffsetを把握する必要があります。これは、頭のてっぺんから次のようになります。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
  if (!decelerate) {
    // get the offset here
  }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  // also get the offset here
}

コンテンツオフセットの値を取得し、それを時間値と分値に変換します。おそらく、コンテンツオフセットのy位置をそれぞれ24または60で除算します。カスタムアートワークを自分で作成する必要があります。

于 2012-06-01T05:24:08.727 に答える
0

日付ピッカーの色を変更するには:

[datePickerView setValue:self.pickerLabelColor forKey:@"textColor"];

そして、フォントを変更する唯一の方法は次のとおりです。

カテゴリUIFont+Systemを作成し、このコードを内部に配置します

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
    + (UIFont *)systemFontOfSize:(CGFloat)fontSize
    {
        return [UIFont fontWithName:fontName size:fontSize];
    }
#pragma clang diagnostic pop

これにより、アプリの別の場所にフォントも設定されます(システムフォントをフォントに置き換えます)。

于 2015-10-24T14:36:39.190 に答える
-1

AppleのUICatalogを確認する必要があります。カスタム日付ピッカーメソッドを含む、UIDatePickerを使用できるすべてのメソッドがあります。このリンクdeveloper.apple.com/library/ios/samplecode/UICatalog/を調べてください。また、彼らは標準的なスイッチと後者で与えられるナビゲーションバーを実装しました。

于 2012-06-01T05:29:10.363 に答える
-1

2の組み合わせがUITableViews進むべき道です。

UITableViewのサブビューでUIScrollViewあるため、次のイベントを処理します

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{

}

位置を取得したら、次の方法を使用してテーブルを中央までスクロールします

[myTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];

お役に立てれば。

于 2012-07-09T14:44:41.543 に答える