ユニクロの新しい目覚ましアプリにはカスタムがありますUIDatePicker
:
そして、私は自分のカスタムを作成したいと思いますUIDatePicker
。
DatePickerの外観を変更しようとしUI_APPEARANCE_SELECTOR
ましたが、何もUIDatePicker
返されません。
ドキュメントによると、値を変更することはできません。
どうすれば私UIDatePicker
の外見を変えることができますか?
ユニクロの新しい目覚ましアプリにはカスタムがありますUIDatePicker
:
そして、私は自分のカスタムを作成したいと思いますUIDatePicker
。
DatePickerの外観を変更しようとしUI_APPEARANCE_SELECTOR
ましたが、何もUIDatePicker
返されません。
ドキュメントによると、値を変更することはできません。
どうすれば私UIDatePicker
の外見を変えることができますか?
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;
}
これをチェックしてください。
このメソッドを実装ファイルに追加します
-(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」の背景色を変更します
iOS 5では、UIAppearanceプロトコルが導入されました。これにより、いくつかのUI要素をカスタマイズできます。UIDatePickerはたまたまこのプロトコルに準拠しているため、これを行う最も簡単な方法です。つまり、iOS5ユーザーのみをサポートする場合です。Matthewのオプションはおそらく次善の策であり、古いiOSバージョンでも機能するはずです。
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つのコンポーネントを実質的に無限にするために、データソースを適切に処理する必要があります。
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で除算します。カスタムアートワークを自分で作成する必要があります。
日付ピッカーの色を変更するには:
[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
これにより、アプリの別の場所にフォントも設定されます(システムフォントをフォントに置き換えます)。
AppleのUICatalogを確認する必要があります。カスタム日付ピッカーメソッドを含む、UIDatePickerを使用できるすべてのメソッドがあります。このリンクdeveloper.apple.com/library/ios/samplecode/UICatalog/を調べてください。また、彼らは標準的なスイッチと後者で与えられるナビゲーションバーを実装しました。
2の組み合わせがUITableViews
進むべき道です。
UITableView
のサブビューでUIScrollView
あるため、次のイベントを処理します
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
}
位置を取得したら、次の方法を使用してテーブルを中央までスクロールします
[myTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
お役に立てれば。