338 lines
12 KiB
Objective-C
338 lines
12 KiB
Objective-C
//
|
|
// UMComPageControlView.m
|
|
// UMCommunity
|
|
//
|
|
// Created by umeng on 15-4-20.
|
|
// Copyright (c) 2015年 Umeng. All rights reserved.
|
|
//
|
|
|
|
#import "UMComPageControlView.h"
|
|
#import "UMComResouceDefines.h"
|
|
#import <CoreText/CoreText.h>
|
|
#import <UMComFoundation/UMComKit+Color.h>
|
|
|
|
@interface UMComPageControlView ()
|
|
|
|
@property (nonatomic,strong) NSMutableDictionary *pageNumDictionary;
|
|
|
|
@property (nonatomic,strong) NSMutableArray *pageNumArray;
|
|
|
|
@end
|
|
|
|
@implementation UMComPageControlView
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
self.pageNumDictionary = [NSMutableDictionary dictionaryWithCapacity:1];
|
|
self.pageNumArray = [NSMutableArray arrayWithCapacity:1];
|
|
self.unselectedColor = UMComColorWithHexString(FontColorGray);
|
|
self.selectedColor = UMComColorWithHexString(FontColorBlue);
|
|
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
|
|
imageView.image = UMComImageWithImageName(@"kuang");
|
|
[self addSubview:imageView];
|
|
self.bgImageView = imageView;
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.indexesOfNotices = [NSMutableArray array];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (id)initWithFrame:(CGRect)frame totalPages:(NSInteger)totalPages currentPage:(NSInteger)currentPage
|
|
{
|
|
self = [self initWithFrame:frame];
|
|
if (self) {
|
|
self.currentPage = currentPage;
|
|
[self resetPagesWithTotalPages:totalPages];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (id)initWithFrame:(CGRect)frame itemTitles:(NSArray *)itemTitles currentPage:(NSInteger)currentPage
|
|
{
|
|
self = [self initWithFrame:frame];
|
|
if (self) {
|
|
self.currentPage = currentPage;
|
|
self.totalPages = itemTitles.count;
|
|
[self setItemTitles:itemTitles];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (id)initWithFrame:(CGRect)frame itemImages:(NSArray *)itemImages currentPage:(NSInteger)currentPage
|
|
{
|
|
self = [self initWithFrame:frame];
|
|
if (self) {
|
|
self.currentPage = currentPage;
|
|
self.totalPages = itemImages.count;
|
|
[self setItemImages:itemImages];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
|
|
- (void)resetPagesWithTotalPages:(NSInteger)totalPage
|
|
{
|
|
self.pageControlItemType = PageControlDefaultType;
|
|
_totalPages = totalPage;
|
|
CGFloat numberHeight = self.frame.size.height;
|
|
CGFloat space = (self.frame.size.width - numberHeight*_totalPages)/(_totalPages +1);
|
|
if (self.pageNumArray.count < _totalPages) {
|
|
for (int index = (int)self.pageNumArray.count; index<_totalPages; index++) {
|
|
UMComPageNumberView *pageNumView = [[UMComPageNumberView alloc]initWithFrame:CGRectMake(index*(space+numberHeight)+space, 0, numberHeight, numberHeight)];
|
|
[self.pageNumArray addObject:pageNumView];
|
|
[self addSubview:pageNumView];
|
|
}
|
|
}else{
|
|
for (int index = (int)_totalPages; index< self.pageNumArray.count; index++) {
|
|
UMComPageNumberView *pageNumView = self.pageNumArray[index];
|
|
[self.pageNumArray removeObjectAtIndex:index];
|
|
[pageNumView removeFromSuperview];
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)setItemTitles:(NSArray *)itemTitles
|
|
{
|
|
self.pageControlItemType = PageControlTitleType;
|
|
_totalPages = itemTitles.count;
|
|
if (itemTitles.count == 0) {
|
|
return;
|
|
}
|
|
self.pageControlItemType = PageControlTitleType;
|
|
CGFloat numberHeight = self.frame.size.height;
|
|
CGFloat numerWidth = self.frame.size.width/itemTitles.count;
|
|
if (self.pageNumArray.count< itemTitles.count) {
|
|
for (int index = 0; index < itemTitles.count; index++) {
|
|
UMComPageNumberView *pageNumView = nil;
|
|
if (index < self.pageNumArray.count) {
|
|
pageNumView = self.pageNumArray[index];
|
|
pageNumView.itemLabel.text = itemTitles[index];
|
|
if (index == 1) {
|
|
pageNumView.frame = CGRectMake(index*numerWidth, 0, numerWidth, numberHeight);
|
|
}else{
|
|
pageNumView.frame = CGRectMake(index*numerWidth, 0, numerWidth, numberHeight);
|
|
}
|
|
}else{
|
|
pageNumView = [[UMComPageNumberView alloc]initWithFrame:CGRectMake(index*numerWidth, 0, numerWidth, numberHeight)];
|
|
if (index == 1) {
|
|
pageNumView.frame = CGRectMake(index*numerWidth, 0, numerWidth, numberHeight);
|
|
}
|
|
pageNumView.itemLabel.text = itemTitles[index];
|
|
[self.pageNumArray addObject:pageNumView];
|
|
[self addSubview:pageNumView];
|
|
}
|
|
|
|
}
|
|
}else{
|
|
for (int index = 0; index < self.pageNumArray.count; index++) {
|
|
UMComPageNumberView *pageNumView = nil;
|
|
if (index < itemTitles.count) {
|
|
pageNumView = self.pageNumArray[index];
|
|
pageNumView.itemLabel.text = itemTitles[index];
|
|
}else{
|
|
UMComPageNumberView *pageNumView = self.pageNumArray[index];
|
|
[self.pageNumArray removeObjectAtIndex:index];
|
|
[pageNumView removeFromSuperview];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)setItemImages:(NSArray *)itemImages
|
|
{
|
|
_totalPages = itemImages.count;
|
|
if (itemImages.count == 0) {
|
|
return;
|
|
}
|
|
self.pageControlItemType = PageControlTitleType;
|
|
CGFloat numberHeight = self.frame.size.height;
|
|
CGFloat numerWidth = self.frame.size.width/itemImages.count;
|
|
if (self.pageNumArray.count< itemImages.count) {
|
|
for (int index = 0; index < itemImages.count; index++) {
|
|
UMComPageNumberView *pageNumView = nil;
|
|
if (index < self.pageNumArray.count) {
|
|
pageNumView = self.pageNumArray[index];
|
|
pageNumView.itemImageView.image = itemImages[index];
|
|
pageNumView.frame = CGRectMake(index*numerWidth, 0, numerWidth, numberHeight);
|
|
}else{
|
|
pageNumView = [[UMComPageNumberView alloc]initWithFrame:CGRectMake(index*numerWidth, 0, numerWidth, numberHeight)];
|
|
pageNumView.itemImageView.image = itemImages[index];
|
|
[self.pageNumArray addObject:pageNumView];
|
|
[self addSubview:pageNumView];
|
|
}
|
|
|
|
}
|
|
}else{
|
|
for (int index = 0; index < self.pageNumArray.count; index++) {
|
|
UMComPageNumberView *pageNumView = nil;
|
|
if (index < itemImages.count) {
|
|
pageNumView = self.pageNumArray[index];
|
|
pageNumView.itemImageView.image = itemImages[index];
|
|
}else{
|
|
UMComPageNumberView *pageNumView = self.pageNumArray[index];
|
|
[self.pageNumArray removeObjectAtIndex:index];
|
|
[pageNumView removeFromSuperview];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)setCurrentPage:(NSInteger)currentPage
|
|
{
|
|
if (currentPage < self.pageNumArray.count) {
|
|
_lastPage = _currentPage;
|
|
_currentPage = currentPage;
|
|
[self reloadPages];
|
|
}
|
|
}
|
|
|
|
- (void)setTotalPages:(NSInteger)totalPages
|
|
{
|
|
_totalPages = totalPages;
|
|
}
|
|
|
|
- (void)setUnselectedColor:(UIColor *)unselectedColor
|
|
{
|
|
_unselectedColor = unselectedColor;
|
|
[self reloadPages];
|
|
}
|
|
|
|
- (void)setSelectedColor:(UIColor *)selectedColor
|
|
{
|
|
_selectedColor = selectedColor;
|
|
[self reloadPages];
|
|
}
|
|
|
|
- (void)reloadPages
|
|
{
|
|
CGFloat numberHeight = self.frame.size.height;
|
|
CGFloat numerWidth = self.frame.size.width/self.pageNumArray.count;
|
|
for (int index = 0; index < self.pageNumArray.count; index++) {
|
|
UMComPageNumberView *pageNumView = self.pageNumArray[index];
|
|
if (index == 1) {
|
|
numerWidth += 0.5;
|
|
}
|
|
pageNumView.frame = CGRectMake(index*numerWidth, 0, numerWidth, numberHeight);
|
|
pageNumView.itemImageView.frame = CGRectMake(0, 0, numerWidth, numberHeight);
|
|
pageNumView.itemLabel.frame = CGRectMake(0, 0, numerWidth, numberHeight);
|
|
pageNumView.index = index;
|
|
if (index == self.currentPage) {
|
|
pageNumView.itemColor = _selectedColor;
|
|
pageNumView.itemLabel.textColor = _selectedColor;
|
|
pageNumView.itemImageView.hidden = NO;
|
|
}else{
|
|
pageNumView.itemColor = _unselectedColor;
|
|
pageNumView.itemImageView.hidden = YES;
|
|
pageNumView.itemNoticeImageView.hidden = YES;
|
|
pageNumView.itemLabel.textColor = _unselectedColor;
|
|
}
|
|
if (self.indexesOfNotices.count > 0) {
|
|
BOOL isShowNotice = NO;
|
|
for (NSNumber *number in self.indexesOfNotices) {
|
|
if (index == [number intValue]) {
|
|
isShowNotice = YES;
|
|
break;
|
|
}
|
|
}
|
|
pageNumView.itemNoticeImageView.hidden = !isShowNotice;
|
|
}else{
|
|
pageNumView.itemNoticeImageView.hidden = YES;
|
|
}
|
|
pageNumView.itemType = PageControlTitleType;
|
|
pageNumView.clickOnItem = ^(NSInteger index){
|
|
if (self.didSelectedAtIndexBlock) {
|
|
self.currentPage = index;
|
|
self.didSelectedAtIndexBlock(index);
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@implementation UMComPageNumberView
|
|
{
|
|
CGFloat itemOffset;
|
|
CGFloat noticeViewWidth;
|
|
}
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
itemOffset = 0;
|
|
noticeViewWidth = 8.6;
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.itemImageView = [[UIImageView alloc]initWithFrame: CGRectMake(itemOffset, itemOffset, frame.size.width-itemOffset*2, frame.size.height-itemOffset*2)];
|
|
self.itemImageView.backgroundColor = [UIColor clearColor];
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.itemLabel = [[UILabel alloc]initWithFrame:CGRectMake(itemOffset, itemOffset, frame.size.width, frame.size.height)];
|
|
self.itemLabel.backgroundColor = [UIColor clearColor];
|
|
self.itemLabel.textAlignment = NSTextAlignmentCenter;
|
|
self.itemLabel.font = UMComFontNotoSansLightWithSafeSize(18);
|
|
[self addSubview:self.itemImageView];
|
|
[self addSubview:self.itemLabel];
|
|
self.itemNoticeImageView = [[UIImageView alloc]initWithFrame:CGRectMake(frame.size.width-noticeViewWidth*3/2, -noticeViewWidth/2, noticeViewWidth, noticeViewWidth)];
|
|
self.itemNoticeImageView.layer.cornerRadius = noticeViewWidth/2;
|
|
self.itemNoticeImageView.clipsToBounds = YES;
|
|
self.itemNoticeImageView.hidden = YES;
|
|
self.itemNoticeImageView.image = UMComImageWithImageName(@"um_red");
|
|
[self addSubview:self.itemNoticeImageView];
|
|
self.itemImageView.userInteractionEnabled = YES;
|
|
self.itemLabel.userInteractionEnabled = YES;
|
|
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(didClickOnItem)];
|
|
[self addGestureRecognizer:tap];
|
|
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)didClickOnItem
|
|
{
|
|
if (self.clickOnItem) {
|
|
self.clickOnItem(self.index);
|
|
}
|
|
}
|
|
|
|
|
|
- (void)setItemType:(PageControlItemType)itemType
|
|
{
|
|
_itemType = itemType;
|
|
[self setNeedsDisplay];
|
|
}
|
|
|
|
- (void)reloadItems
|
|
{
|
|
self.itemLabel.frame = CGRectMake(itemOffset, itemOffset, self.frame.size.width-2*itemOffset, self.frame.size.height-2*itemOffset);
|
|
self.itemImageView.frame = CGRectMake(itemOffset, itemOffset, self.frame.size.width-2*itemOffset, self.frame.size.height-2*itemOffset);
|
|
self.itemNoticeImageView.frame = CGRectMake(self.frame.size.width-noticeViewWidth*3/2, -noticeViewWidth/2, noticeViewWidth, noticeViewWidth);
|
|
[self setNeedsDisplay];
|
|
}
|
|
|
|
- (void)drawRect:(CGRect)rect
|
|
{
|
|
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
if (self.itemType == PageControlDefaultType) {
|
|
// Border
|
|
// CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
|
|
CGContextSetFillColorWithColor(context, self.itemColor.CGColor);
|
|
CGContextFillEllipseInRect(context, self.bounds);
|
|
// Body
|
|
CGContextSetFillColorWithColor(context, self.itemColor.CGColor);
|
|
CGContextFillEllipseInRect(context, CGRectInset(self.bounds, 1.0, 1.0));
|
|
// Checkmark
|
|
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
|
|
CGContextSetLineWidth(context, 0.5);
|
|
CGContextStrokePath(context);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@end |