IOS 自定义UIPickView详解及实例代码

发布时间 - 2026-01-10 22:03:19    点击率:

IOS 自定义UIPickView

苹果一直推崇使用原生的组件,自带的UIPickView其实也很漂亮了,看起来也很美观。但是有时候,产品会有一些特殊的设计和需求。本文将会讲解如何修改苹果原生的组件的属性,达到自定义UIPickView的效果。

需求如下。需要自定义一个Tab。自定义选中文字的颜色。自定义选中颜色背景,自定义未选中文字颜色。

修改未选中的文字的字体和颜色

经过分析,上面的取消和确定按钮实现起来还是很简单的。加一个条就好了,我就不介绍具体步骤,下面的没有选中时候文字的样色,已经字体大小,我们都可以在下面的代理方法里面修改。

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


  CGFloat width = [self pickerView:self.pickerView widthForComponent:component];
  CGFloat rowheight =[self pickerView:self.pickerView rowHeightForComponent:(component)];

  UIView *myView = [[UIView alloc]init];
  myView.frame =CGRectMake(0.0f, 0.0f, width, rowheight);
  UILabel *txtlabel = [[UILabel alloc] init];
  txtlabel.textColor = self.plainColor;
  txtlabel.tag=200;
  txtlabel.font = [UIFont systemFontOfSize:15*SCALE_6];
  txtlabel.textAlignment = NSTextAlignmentCenter;
  txtlabel.frame = myView.frame;
  txtlabel.text = [self pickerView:pickerView titleForRow:row forComponent:component];

  [myView addSubview:txtlabel];  
  return myView;
}

这样就可以修改未选中文字的颜色了。

修改选中的背景颜色和字体

但是背景颜色和字体如何修改呢。就是下图这个颜色和自体:

我一开始尝试了在这种方法,就是在上面加一层Label。然后在代理方法中改变Label的值。

-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
  if (component==0) {
    return self.leftArray[row];

  }else if(component==1){
    return self.rightArray[row];
  }else {
  return self.rightArray[row];
  }
}

不过这个方法在如果使用手指点击的话,索引值是对不上的,这样的后果就是,Label会一卡一卡的。如果只在这个方法设置Label的值,那快速滑动的时候获取不到值,Label值变化就会很慢。完全没有了原生的那种效果了。

最后,我才用的是获取系统图层的方法,在选择器的代理方法里面获取相应的图层,然后进行修改。我们先看一下PickView的图层。

我们只需要在代理方面里面拿到对应的视图然后修改就好

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


  CGFloat width = [self pickerView:self.pickerView widthForComponent:component];
  CGFloat rowheight =[self pickerView:self.pickerView rowHeightForComponent:(component)];

  UIView *myView = [[UIView alloc]init];
  myView.frame =CGRectMake(0.0f, 0.0f, width, rowheight);
  UILabel *txtlabel = [[UILabel alloc] init];
  txtlabel.textColor = self.plainColor;
  txtlabel.tag=200;
  txtlabel.font = [UIFont systemFontOfSize:15*SCALE_6];
  txtlabel.textAlignment = NSTextAlignmentCenter;
  txtlabel.frame = myView.frame;
  txtlabel.text = [self pickerView:pickerView titleForRow:row forComponent:component];

  [myView addSubview:txtlabel];

  UIView* topLine  =  [pickerView.subviews objectAtIndex:1];
  UIView* botomLine  =  [pickerView.subviews objectAtIndex:2];
  topLine.hidden = YES;
  botomLine.hidden = YES;

  BOOL isSetttingBackColor = NO;

  UIView *subview = [self.pickerView.subviews firstObject];

  for ( UIView *pickerColumnView in subview.subviews) {

    NSLog(@"pickerColumnView class %@",[pickerColumnView class]);

    UIView *pickerView = [pickerColumnView.subviews lastObject];
    if (!isSetttingBackColor) {
       pickerView.backgroundColor = self.selectedBackColor;
      isSetttingBackColor = !isSetttingBackColor;
    }

    UIView *tableView = [pickerView.subviews lastObject];
    for (UIView *cell in tableView.subviews) {
      NSLog(@"cell class %@",[cell class]);
      UIView *cellview = [cell.subviews lastObject];
      UIView *labelSuper = [cellview.subviews lastObject];
      UILabel *label = [labelSuper.subviews lastObject];
      label.textColor = [UIColor whiteColor];
    }

  }
  return myView;
}

下面的代码是用户隐藏pickView自带的两根细线。

 UIView* topLine  =  [pickerView.subviews objectAtIndex:1];
  UIView* botomLine  =  [pickerView.subviews objectAtIndex:2];
  topLine.hidden = YES;
  botomLine.hidden = YES;

设置是否修改颜色BOOL isSetttingBackColor = NO;这个变量是为了防止多次设置背景颜色。造成相互遮盖。

最后效果如下:

Demo地址:http://xiazai./201612/yuanma/JSDCustomPickView-master().rar

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# IOS  # 自定义UIPickView  # 自定义UIPickView实例  # UIPickView自定义实现示例  # IOS10 隐私权限设置实例详解  # IOS 静态库打包流程简化详细介绍  # IOS 静态库和Framework区别  # iOS自定义UICollectionViewLayout实现瀑布流布局  # IOS UITableViewCell详解及按钮点击事件处理实例  # IOS 开发之自定义按钮实现文字图片位置随意定制  # 详解iOS开发 - 用AFNetworking实现https单向验证  # 双向验证  # IOS开发 UIAlertController详解及实例代码  # 自定义  # 图层  # 也很  # 自带  # 的是  # 就会  # 会有  # 将会  # 在这  # 就不  # 我一  # 就好  # 只需  # 要在  # 不上  # 希望能  # 很简单  # 只在  # 种方法  # 在上面 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  香港服务器部署网站为何提示未备案?  网站建设保证美观性,需要考虑的几点问题!  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  高防服务器租用首荐平台,企业级优惠套餐快速部署  微信推文制作网站有哪些,怎么做微信推文,急?  javascript基于原型链的继承及call和apply函数用法分析  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何在IIS中配置站点IP、端口及主机头?  公司门户网站制作流程,华为官网怎么做?  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  英语简历制作免费网站推荐,如何将简历翻译成英文?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  大型企业网站制作流程,做网站需要注册公司吗?  如何挑选最适合建站的高性能VPS主机?  Laravel怎么实现模型属性的自动加密  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  免费网站制作appp,免费制作app哪个平台好?  在线教育网站制作平台,山西立德教育官网?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  在线制作视频网站免费,都有哪些好的动漫网站?  使用C语言编写圣诞表白程序  Linux系统命令中screen命令详解  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  如何用好域名打造高点击率的自主建站?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Python函数文档自动校验_规范解析【教程】  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Android okhttputils现在进度显示实例代码  如何用wdcp快速搭建高效网站?  Firefox Developer Edition开发者版本入口  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  昵图网官方站入口 昵图网素材图库官网入口  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践