12

优衣库的新闹钟应用有一个自定义UIDatePicker

风俗

我想创建自己的自定义UIDatePicker

UI_APPEARANCE_SELECTOR我试图改变 DatePicker 的外观,但在UIDatePicker返回中寻找nothing

这意味着它不可能更改任何值,根据文档:

为了支持外观定制,一个类必须符合 UIAppearanceContainer 协议,并且相关的访问器方法必须用 UI_APPEARANCE_SELECTOR 标记。

怎样才能改变我UIDatePicker的容貌?

4

8 回答 8

28

API 不提供执行此操作的方法。您可以使用 UIPickerView 而不是使用 UIDatePicker 自己制作一个非常令人信服的副本。

由于 UIDatePicker 或 UIPickerView 没有 UI_APPEARANCE_SELECTOR ,即使您无法将 UIDatePicker 内容的外观更改为其 UIControl 并且没有任何委托,因此它具有其本机外观,而在 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 的所有子视图,只需选择任何索引并一一修改它们

修改 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

似乎很难改变 a 的UIDatePicker出现方式。

在我看来,您提供的示例是对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;

委托上的方法,您可以使选择器视图的单个元素以您想要的方式显示。然后,您将必须适当地处理数据源,以使选择器的两个组件实际上是无限的。

于 2012-07-04T13:58:24.600 回答
3

iOS 5 引入了UIAppearance协议,它允许您自定义多个 UI 元素。UIDatePicker 恰好符合这个协议,所以这可能是最简单的方法。也就是说,如果您愿意只支持 iOS 5 用户。Matthew 的选项可能是下一个最好的选择,它也应该适用于较旧的 iOS 版本。

于 2012-06-01T05:32:16.633 回答
0

您可以使用两个 UIScrollViews 自己实现一个,一个用于几小时,一个用于几分钟。当每个滚动视图停止移动时,您只需要弄清楚它的 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

A combination of 2 UITableViews is the way to go.

UITableView is a subview of UIScrollView, so it handles the following event

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

}

and on getting the position, just scroll the table to the center using the following method

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

Hope this helps.

于 2012-07-09T14:44:41.543 回答
-1

你应该通过 Apple 的 UICatalog。它具有可以使用 UIDatePicker 的所有方法,包括自定义日期选择器方法。研究这个链接 developer.apple.com/library/ios/samplecode/UICatalog/ 。他们还实现了标准开关和后者中给出的导航栏。

于 2012-06-01T05:29:10.363 回答