ifish/Ifish/UMCommunity/UMCommunitySDK/UMCommunityUI/CustomView/PageControlView/UMComPageControlView.m

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