转自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. Html 字体大小单位 px em pt

    网页上定义字体大小有常见三种单位,px.em.pt px px是pixel缩写,是基于像素的单位.在浏览网页过程中,屏幕上的文字.图片等会随屏幕的分辨率变化而变化,一个100px宽度大小的图片,在80 ...

  2. [BTS] Action demo In BizTalk WCF-SAP Adapter

    I use following xml config in BizTalk 2010 WCF-SAP adapter. <BtsActionMapping xmlns:xsi="htt ...

  3. SublimeText2 快捷键一览

    ctrl+shift+w: 关闭Sublime,关闭所有打开文件ctrl+n: 新建文件ctrl+s: 保存ctrl+shift+s: 另存为ctrl+f4: 关闭文件ctrl+w: 关闭f11: 切 ...

  4. iOS JSPatch 热修复使用

    概述 一说到热修复,可能很多人会觉得应该很复杂,很难用(我以前是这么觉得的...),实际使用起来蛮简单的,这里以一个小demo演示热修复是如何修复崩溃的,具体更深入的用法,可以看这个https://g ...

  5. duilib进阶教程 -- 响应windows原生消息和自定义消息(13)

    一.windows原生消息 同样,入门教程只是给出了响应windows原生消息的方法,并没给出例子,这里以自适应屏幕分辨率为例.迅雷播放器虽然可以在启动的时候自动调整窗口大小,但是当屏幕分辨率实时改变 ...

  6. atitit.架构设计---方法调用结果使用异常还是返回值

    atitit.架构设计---方法调用结果使用异常还是返回值 1. 应该返回BOOL类型还是异常 1 2. 最终会有四种状况,抛出异常.返回特殊值.阻塞.超时 1 3. 异常的优缺点点 1 4. jav ...

  7. Leetcode 88 Merge Sorted Array STL

    合并有序数组 时间复杂度O(m+n) 该算法来自各种算法与数据结构书,写得已经烂得不能再烂了,这个应该是最短的代码了吧,不知如何归类 class Solution { public: void mer ...

  8. 大家一起写mvc(三)_结束

    上一篇介绍到要写mvc的所用的核心技术,这一篇我们就开始真正的开始写mvc,其实就是把昨天写过的代码进行一些组装就可以了. 我们用eclipse新建一个web项目.然后web.xml如下 <?x ...

  9. HTML5手机APP开发入(3)

    HTML5手机APP开发入(3) 课程内容: 按照AngularJs MVC框架进行代码重构,新建一个DataService服务类使用SQLite插件实现储存对通讯录的本地存储. 涉及的知识点: An ...

  10. Spring+hibernate+struts

    一.Spring 主要功能:解耦和(对象之间可配置,依赖注入的) 1.概念: 容器:容器可以装载对象,实例化对象,配置对象之间的依赖关系. IOC/DIIOC:Inversion of Control ...