转自snorlax's blog

先说下ios7之前 那些点点的实现非常简单 就是UIPageControl.subviews 就是一个个点的UIImageView 所以只需简单的替换掉就好了代码如下:@property(nonatomic,strong)UIImage *_activeImage;

  1. @property(nonatomic,strong)UIImage *_inactiveImage;
  2. //在init的时候把你自己定义的两张图片搞进去
  3. - (void)updateDots
  4. {
  5. for (int i = 0; i< [self.subviews count]; i++) {
  6. UIImageView* dot =[self.subviews objectAtIndex:i];
  7.  
  8. if (i == self.currentPage) {
  9. if ([dot respondsToSelector:@selector(setImage:)]) {
  10. dot.image=_activeImage;
  11. }
  12.  
  13. } else {
  14. if ([dot respondsToSelector:@selector(setImage:)]) {
  15. dot.image=_inactiveImage;
  16. }
  17. }
  18. }
  19. }
  20. //然后自己重载一下setNumber就好了
  21.  
  22. - (void)setNumberOfPages:(NSInteger)numberOfPages
  23. {
  24. [super setNumberOfPages:numberOfPages];
  25. [self updateDots];
  26. }
  27.  
  28. ios7改掉了连底层实现……整个pagecontrol subviewsUIView乱七八糟……而且都是view根本就没了image属性、
    所以照样使用ios7之前的定制图片pagecontrol点的方法会出错。
  29.  
  30. 解决方法:就要重写UIView的绘画函数了代码大致如下
  1. #import "ZDPageControll.h"
  2. #import <QuartzCore/QuartzCore.h>
  3.  
  4. @interface ZDPageControll()
  5. {
  6. UIImage *_activeImage;
  7. UIImage *_inactiveImage;
  8. NSArray *_usedToRetainOriginalSubview;
  9. }
  10.  
  11. @end
  12.  
  13. @implementation ZDPageControll
  14. @synthesize kSpacing=_kSpacing;
  15. - (id)initWithFrame:(CGRect)frame currentImageName:(NSString *)current commonImageName:(NSString *)common
  16. {
  17. self= [super initWithFrame:frame];
  18. if ([self respondsToSelector:@selector(setCurrentPageIndicatorTintColor:)] && [self respondsToSelector:@selector(setPageIndicatorTintColor:)]) {
  19. [self setCurrentPageIndicatorTintColor:[UIColor clearColor]];
  20. [self setPageIndicatorTintColor:[UIColor clearColor]];
  21. }
  22.  
  23. [self setBackgroundColor:[UIColor clearColor]];
  24. _activeImage= [UIImage imageNamed:current];
  25. _inactiveImage= [UIImage imageNamed:common];
  26. _kSpacing=10.0f;
  27. //hold住原来pagecontroll的subview
  28. _usedToRetainOriginalSubview=[NSArray arrayWithArray:self.subviews];
  29. for (UIView *su in self.subviews) {
  30. [su removeFromSuperview];
  31. }
  32. self.contentMode=UIViewContentModeRedraw;
  33. return self;
  34. }
  35. -(void)dealloc
  36. {
  37. //释放原来hold住的那些subview
  38. _usedToRetainOriginalSubview=nil;
  39. _activeImage=nil;
  40. _inactiveImage=nil;
  41. }
  42. - (void)updateDots
  43. {
  44.  
  45. for (int i = 0; i< [self.subviews count]; i++) {
  46. UIImageView* dot =[self.subviews objectAtIndex:i];
  47.  
  48. if (i == self.currentPage) {
  49. if ([dot respondsToSelector:@selector(setImage:)]) {
  50. dot.image=_activeImage;
  51. }
  52.  
  53. } else {
  54. if ([dot respondsToSelector:@selector(setImage:)]) {
  55. dot.image=_inactiveImage;
  56. }
  57. }
  58. }
  59. }
  60.  
  61. - (void)setCurrentPage:(NSInteger)currentPage
  62. {
  63. [super setCurrentPage:currentPage];
  64. if ([[[UIDevice currentDevice]systemVersion]floatValue] <=6.0) {
  65. [self updateDots];
  66. }
  67. // [self updateDots];
  68. [self setNeedsDisplay];
  69. }
  70. - (void)setNumberOfPages:(NSInteger)numberOfPages
  71. {
  72. [super setNumberOfPages:numberOfPages];
  73. if ([[[UIDevice currentDevice]systemVersion]floatValue] <=6.0) {
  74. [self updateDots];
  75. }
  76. // [self updateDots];
  77. [self setNeedsDisplay];
  78.  
  79. }
  80. -(void)drawRect:(CGRect)iRect
  81. {
        if ([kIphoneVersionfloatValue]>=7.0){//加个判断
  1. int i;
  2. CGRect rect;
  3.  
  4. UIImage *image;
  5. iRect = self.bounds;
  6.  
  7. if ( self.opaque ) {
  8. [self.backgroundColor set];
  9. UIRectFill( iRect );
  10. }
  11.  
  12. if ( self.hidesForSinglePage && self.numberOfPages == 1 ) return;
  13.  
  14. rect.size.height = _activeImage.size.height;
  15. rect.size.width = self.numberOfPages * _activeImage.size.width + ( self.numberOfPages - 1 ) * _kSpacing;
  16. rect.origin.x = floorf( ( iRect.size.width - rect.size.width ) / 2.0 );
  17. rect.origin.y = floorf( ( iRect.size.height - rect.size.height ) / 2.0 );
  18. rect.size.width = _activeImage.size.width;
  19.  
  20. for ( i = 0; i < self.numberOfPages; ++i ) {
  21. image = i == self.currentPage ? _activeImage : _inactiveImage;
  22.  
  23. [image drawInRect: rect];
  24.  
  25. rect.origin.x += _activeImage.size.width + _kSpacing;
  26. }

}else {

}

  1. }
  2. @end
  1.  

iOS 7定制UIPageControl遇到的问题的更多相关文章

  1. iOS开发-定制多样式二维码

    iOS开发-定制多样式二维码   二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...

  2. iOS拍照定制之AVCaptureVideoDataOutput

    问题 领导看了前面做的拍照,问了句"哪来的声音", "系统的,自带的,你看系统的拍照也有声音" "有办法能去掉吗?挺糟心的" "我 ...

  3. iOS拍照定制之AVCapturePhotoOutput

    问题 领导安排任务,写个拍照功能,界面跟系统拍照有点出入 拍完照片,底部显示已拍照片,有个拍照上限[在此不论] 点击已拍照片,可以预览.放大缩小查看 思路 系统拍照肯定不行了,只能定制,没提是否拍照禁 ...

  4. iOS— UIScrollView和 UIPageControl之间的那些事

    本代码主要实现在固定的位置滑动图片可以切换. 目录图如下: ViewController.h #import <UIKit/UIKit.h> // 通过宏定义定义宽和高 #define W ...

  5. iOS自定制tabbar与系统的tabbar冲突,造成第一次点击各个item图片更换选中,第二次选中部分item图片不改变

    可以选择是使用自定制的还是系统的,如果使用自定制的,就使用以下方法即可隐藏系统的uitabbarButton,从而使item恢复正确 //隐藏UITabBarButton -(void)viewWil ...

  6. iOS之定制tabbar

    我们知道,一个Tab控制器控制着若干视图控制器,它是由一个数组进行管理的,每一个Tab控制器只有一 UITabBar视图,用于显示UITabBarItem实例.我们通过点击UITabBarItem来切 ...

  7. iOS关于定制某个控件四个角是否为圆角

    UIView *myView=[[UIView alloc]initWithFrame:CGRectMake(50, 70, 200, 200)]; UIBezierPath * bezierPath ...

  8. iOS:定制自适应大小的透明吐司弹框

    一.简单介绍 创建一个吐司消息的黑色透明弹框,可以根据消息长短自适应大小. 可以手动创建手动显示手动关闭,也可以手动创建自动显示自动关闭. 简单好用. 二.代码使用 .h文件 // // LiveHU ...

  9. iOS开发——定制圆形头像与照相机图库的使用

    如今的App都很流行圆形的头像,比方QQ右上角的头像,今日头条的头像等等.这已经成为App设计的趋势了.今天我们就来简单实现一下这个功能,我还会把从手机拍照中或者图库中取出作为头像的照片存储到应用程序 ...

随机推荐

  1. [游戏学习25] MFC 橡皮筋画线效果

    >_<:这是给出窗口内外不同情况的处理展示的例子. >_<:MouseCap.h #include<afxwin.h> class CMyApp :public C ...

  2. [JS13] ActivetX

    <HTML> <head> <title>JavaScript Unleashed</title> <script type="text ...

  3. Leetcode 165 Compare Version Numbers

    题意:比较版本号的大小 有点变态,容易犯错 本质是字符串的比较,请注意他的版本号的小数点不知1个,有的会出现01.0.01这样的变态版本号 class Solution { public: int c ...

  4. 前端框架layui

    可以了解下jQuery组件layer layui开始使用Layui兼容除IE6/7以外的全部浏览器,并且绝大多数结构支持响应式 弹出层如果你使用的是Layui,那么你直接在官网下载layui框架即可, ...

  5. Hibernate入门4.核心技能

    Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...

  6. Shell获取上一个月、星期的时间范围

    #!/bin/bash date_today=`date -d '1 day ago' +%Y%m%d`   #最近7天 date_befor_7day=`date -d '7 day ago' +% ...

  7. android: SQLite查询数据

    掌握了查询数据的方法之后,你也就将数据库的 CRUD 操 作全部学完了.不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种 操作. 我们都知道 SQL 的全称是 Structured ...

  8. 都昌 DCWriter电子病历编辑器演示文档截屏

  9. Windows中搭建已存在的Octopress环境

    // 当我们需要在不同的电脑上来对同一个Octopress博客进行维护的时候就需要针对已存在的Octopress来设置环境了, 安装相应的软件 Git:http://msysgit.googlecod ...

  10. 一个purge参数引发的惨案——从线上hbase数据被删事故说起

    在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”.   ...