转自snorlax's blog

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

@property(nonatomic,strong)UIImage *_inactiveImage;
//在init的时候把你自己定义的两张图片搞进去
- (void)updateDots
{
for (int i = 0; i< [self.subviews count]; i++) {
UIImageView* dot =[self.subviews objectAtIndex:i];
 
if (i == self.currentPage) {
if ([dot respondsToSelector:@selector(setImage:)]) {
dot.image=_activeImage;
}
 
} else {
if ([dot respondsToSelector:@selector(setImage:)]) {
dot.image=_inactiveImage;
}
}
}
}
//然后自己重载一下setNumber就好了
 
- (void)setNumberOfPages:(NSInteger)numberOfPages
{
[super setNumberOfPages:numberOfPages];
[self updateDots];
} ios7改掉了连底层实现……整个pagecontrol 的subviews是UIView乱七八糟……而且都是view根本就没了image属性、
所以照样使用ios7之前的定制图片pagecontrol点的方法会出错。 解决方法:就要重写UIView的绘画函数了代码大致如下
#import "ZDPageControll.h"
#import <QuartzCore/QuartzCore.h>
 
@interface ZDPageControll()
{
UIImage *_activeImage;
UIImage *_inactiveImage;
NSArray *_usedToRetainOriginalSubview;
}
 
@end
 
@implementation ZDPageControll
@synthesize kSpacing=_kSpacing;
- (id)initWithFrame:(CGRect)frame currentImageName:(NSString *)current commonImageName:(NSString *)common
{
self= [super initWithFrame:frame];
if ([self respondsToSelector:@selector(setCurrentPageIndicatorTintColor:)] && [self respondsToSelector:@selector(setPageIndicatorTintColor:)]) {
[self setCurrentPageIndicatorTintColor:[UIColor clearColor]];
[self setPageIndicatorTintColor:[UIColor clearColor]];
}
 
[self setBackgroundColor:[UIColor clearColor]];
_activeImage= [UIImage imageNamed:current];
_inactiveImage= [UIImage imageNamed:common];
_kSpacing=10.0f;
//hold住原来pagecontroll的subview
_usedToRetainOriginalSubview=[NSArray arrayWithArray:self.subviews];
for (UIView *su in self.subviews) {
[su removeFromSuperview];
}
self.contentMode=UIViewContentModeRedraw;
return self;
}
-(void)dealloc
{
//释放原来hold住的那些subview
_usedToRetainOriginalSubview=nil;
_activeImage=nil;
_inactiveImage=nil;
}
- (void)updateDots
{
 
for (int i = 0; i< [self.subviews count]; i++) {
UIImageView* dot =[self.subviews objectAtIndex:i];
 
if (i == self.currentPage) {
if ([dot respondsToSelector:@selector(setImage:)]) {
dot.image=_activeImage;
}
 
} else {
if ([dot respondsToSelector:@selector(setImage:)]) {
dot.image=_inactiveImage;
}
}
}
}
 
- (void)setCurrentPage:(NSInteger)currentPage
{
[super setCurrentPage:currentPage];
if ([[[UIDevice currentDevice]systemVersion]floatValue] <=6.0) {
[self updateDots];
}
// [self updateDots];
[self setNeedsDisplay];
}
- (void)setNumberOfPages:(NSInteger)numberOfPages
{
[super setNumberOfPages:numberOfPages];
if ([[[UIDevice currentDevice]systemVersion]floatValue] <=6.0) {
[self updateDots];
}
// [self updateDots];
[self setNeedsDisplay];
 
}
-(void)drawRect:(CGRect)iRect
{
    if ([kIphoneVersionfloatValue]>=7.0){//加个判断
    int i;
CGRect rect;
 
UIImage *image;
iRect = self.bounds;
 
if ( self.opaque ) {
[self.backgroundColor set];
UIRectFill( iRect );
}
 
if ( self.hidesForSinglePage && self.numberOfPages == 1 ) return;
 
rect.size.height = _activeImage.size.height;
rect.size.width = self.numberOfPages * _activeImage.size.width + ( self.numberOfPages - 1 ) * _kSpacing;
rect.origin.x = floorf( ( iRect.size.width - rect.size.width ) / 2.0 );
rect.origin.y = floorf( ( iRect.size.height - rect.size.height ) / 2.0 );
rect.size.width = _activeImage.size.width;
 
for ( i = 0; i < self.numberOfPages; ++i ) {
image = i == self.currentPage ? _activeImage : _inactiveImage;
 
[image drawInRect: rect];
 
rect.origin.x += _activeImage.size.width + _kSpacing;
}

}else {

}

}
@end
 


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. 使用jsdoc-toolkit实现JS API文档自动化

    在前面的博文中探讨自动化工程问题时,写过基于NodeJS的,使用gulp.grunt的jsdoc插件实现文档自动化.本文探讨基于java环境的自动化实现. 一.Java安装与环境配置 关于Java的安 ...

  2. Django时间查询

    1.gt:大于某个时间now = datetime.datetime.now()#前一天start = now – datetime.timedelta(hours=23, minutes=59, s ...

  3. DataGridView列排序混乱的处理方法

    在C#程序开发中DataGridView可以说是使用最多的数据呈现控件了,但是在使用的过程中我们会发现当绑定的数据源有较多数据列的时候,DataGridView上显示的列的顺序就会出现混乱的现象. 那 ...

  4. [jQuery学习系列一]1-选择器与DOM对象

    前言: 好久没有更新博客了, 最近想复习下 之前学过的JS的相关内容, 也算是自己的一种总结. 知识长时间不用就会忘记, 多学多记多用!! 下面的程序都可以在下面的网站进行在线调试: http://w ...

  5. paip.字符串操作uapi java php python总结..

    paip.字符串操作uapi java php python总结.. java and php 相互转换.. import strUtil>>>  requiry(strUtil.p ...

  6. Linux 常用命令小结

    学习脚本几天了,总结下linux debian下脚本常用命令. Linux    1.添加删除账户 useradd / userdel    2.修改"张三"密码 passwd 张 ...

  7. hive函数 -- split 字符串分割函数

    hive字符串分割函数 split(str, regex) - Splits str around occurances that match regexTime taken: 0.769 secon ...

  8. shell 时间统计脚本

    #!/bin/sh #Today=`date +%Y%m%d` YEAR=`echo $|cut -c -` MONTH=`echo $|cut -c -` DAY=`echo $|cut -c -` ...

  9. Windows 8.1/Server 2012 R2/Embedded 8.1 with Update 3(MSDN最新版)

    微软于12月16日更新了包含Update 3的ISO,此次更新并不会明显改善用户的界面体验,下载后请校验MD5.我整理了中.英文的8.1/服务器版/嵌入式版本/多国语言包. 1,Windows 8.1 ...

  10. 分享自己写的一个小工具RGB转十六进制(高手勿喷)

    由于工作经常美工给的颜色是rgb,而我们网页里面是16进制.网上也有很多类型的工具.不过似乎都用浏览器打开.没网就不爽了 实现也很简单.代码已经共享了 http://git.oschina.net/w ...