一個(gè)自定義的圓環(huán),可轉(zhuǎn)動(dòng)骄恶,給每個(gè)按鈕添加跳轉(zhuǎn)或者事件食铐,自己加了一些點(diǎn)擊時(shí)播放系統(tǒng)的聲音和振動(dòng),直接上代碼僧鲁,粘貼復(fù)制可用:
.h文件:
.m文件:
#pragma mark -? 加子視圖
- (void)addSubviewWithSubView:(NSArray *)imageArray andTitle:(NSArray *)titleArray andSize:(CGSize)size andCenterImage:(UIImage *)centerImage
{
_subViewSize=size;
_numOfSubView = (CGFloat)titleArray.count;
btnArray = [[NSMutableArray alloc]init];
for(NSInteger i=0; i<_numOfSubView ;i++){
UIButton *button=[[UIButton alloc] initWithFrame:CGRectMake(20*Width, 20*Width, size.width*Width, size.height*Height)];
[button setImage:imageArray[i] forState:UIControlStateNormal];
//設(shè)置image在button上的位置(上top虐呻,左left,下bottom悔捶,右right)這里可以寫負(fù)值铃慷,對(duì)上寫-5单芜,那么image就象上移動(dòng)5個(gè)像素
[button setTitle:titleArray[i] forState:UIControlStateNormal];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
button.titleLabel.font = [UIFont systemFontOfSize:16*Width];
button.titleLabel.textAlignment = NSTextAlignmentCenter;
CGFloat devcide = KScreenHeight;
//? ? ? ? button.imageEdgeInsets = UIEdgeInsetsMake(6*Width,6*Width,10*Width,button.titleLabel.bounds.size.width);
if (devcide == 568.000000) {
button.imageEdgeInsets = UIEdgeInsetsMake(6,6,8,button.titleLabel.bounds.size.width);
button.titleEdgeInsets = UIEdgeInsetsMake(55, -button.imageView.bounds.size.width-50, 0, 8);
}else if (devcide == 480.000000){
button.imageEdgeInsets = UIEdgeInsetsMake(2,10,5,button.titleLabel.bounds.size.width);
button.titleEdgeInsets = UIEdgeInsetsMake(55, -button.imageView.bounds.size.width-50, 2, 5);
}else if (devcide == 736.000000){
button.imageEdgeInsets = UIEdgeInsetsMake(8,8,8,button.titleLabel.bounds.size.width);
button.titleEdgeInsets = UIEdgeInsetsMake(70, -button.imageView.bounds.size.width-40, 0, 0);
}else{
button.imageEdgeInsets = UIEdgeInsetsMake(5,6,8,button.titleLabel.bounds.size.width);
button.titleEdgeInsets = UIEdgeInsetsMake(60, -button.imageView.bounds.size.width-45, 0, 0);
}
[button addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
button.tag=100+i;
[btnArray addObject:button];
[_subViewArray addObject:button];
[_circleView addSubview:button];
}
[self layoutBtn];
//中間視圖
UIButton *buttonCenter=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width/3.0, self.frame.size.height/3.0)];
buttonCenter.tag=100+_numOfSubView+1;
buttonCenter.layer.cornerRadius=self.frame.size.width/6.0;
//? ? [buttonCenter setTitleColor:[UIColor blackColor]forState:UIControlStateNormal];
[buttonCenter setImage:centerImage forState:UIControlStateNormal];
buttonCenter.center=CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
[buttonCenter addTarget:self action:@selector(clickBtnCenter:) forControlEvents:UIControlEventTouchUpInside];
[_subViewArray addObject:buttonCenter];
[_circleView addSubview:buttonCenter];
//加轉(zhuǎn)動(dòng)手勢
_pgr=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(zhuanPgr:)];
[_circleView addGestureRecognizer:_pgr];
//加點(diǎn)擊效果
for (NSInteger i=0; i<_subViewArray.count; i++) {
UIButton *button=_subViewArray[i];
[button addTarget:self action:@selector(subViewOut:) forControlEvents:UIControlEventTouchUpInside];
}
}
- (void)clickBtn:(UIButton *)btn
{
NSLog(@"%zd圓環(huán)按鈕點(diǎn)擊了",btn.tag);
kaiduImage.alpha = 1;
[UIView animateWithDuration:2.0 animations:^{
kaiduImage.alpha = 0;
} completion:^(BOOL finished) {
}];
if (btn.tag == 100) {
mStartAngle = M_PI_2*3;
[self layoutBtn];
}
if (btn.tag == 101) {
mStartAngle = M_PI_2*2.32;
[self layoutBtn];
}
if (btn.tag == 102) {
mStartAngle = M_PI_2*1.68;
[self layoutBtn];
}
if (btn.tag == 103) {
mStartAngle = M_PI_2*1;
[self layoutBtn];
}
if (btn.tag == 104) {
mStartAngle = M_PI_2*0.32;
[self layoutBtn];
}
if (btn.tag == 105) {
//? ? ? ? mStartAngle = M_PI_2*3.66;
mStartAngle = -M_PI_2*0.32;
[self layoutBtn];
}
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
if ([user boolForKey:@"voice"]) {
//播放音效
//1.獲得音效文件的全路徑
NSURL *soundUrl = [[NSBundle mainBundle] URLForResource:@"click.wav" withExtension:nil];
//2.加載音效文件蜕该,創(chuàng)建音效ID(SoundID,一個(gè)ID對(duì)應(yīng)一個(gè)音效文件)
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundUrl, &soundID);
//把需要銷毀的音效文件的ID傳遞給它既可銷毀
AudioServicesPlaySystemSound(soundID);
}
if ([user boolForKey:@"vibration"]) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
}
//點(diǎn)擊圓心按鈕
- (void)clickBtnCenter:(UIButton *)btnCenter
{
NSLog(@"圓心按鈕點(diǎn)擊了");
}
//按鈕布局
-(void)layoutBtn{
for (NSInteger i=0; i<_numOfSubView ;i++) {// 178,245
CGFloat devcide = KScreenHeight;
if (devcide == 480.000000) {
CGFloat yy=145+sin((i/_numOfSubView)*M_PI_2*4+mStartAngle)*(self.frame.size.width/2-_subViewSize.width/2-20);
CGFloat xx=148+cos((i/_numOfSubView)*M_PI_2*4+mStartAngle)*(self.frame.size.width/2-_subViewSize.width/2-20);
UIButton *button=[btnArray objectAtIndex:i];
button.center=CGPointMake(xx, yy);
}else if (devcide == 736.000000){
CGFloat yy=195+sin((i/_numOfSubView)*M_PI_2*4+mStartAngle)*(self.frame.size.width/2-_subViewSize.width/2-30);
CGFloat xx=195+cos((i/_numOfSubView)*M_PI_2*4+mStartAngle)*(self.frame.size.width/2-_subViewSize.width/2-30);
UIButton *button=[btnArray objectAtIndex:i];
button.center=CGPointMake(xx, yy);
}else{
CGFloat yy=175*Height+sin((i/_numOfSubView)*M_PI*2+mStartAngle)*(self.frame.size.width/2-_subViewSize.width/2-20*Height);
CGFloat xx=175*Width+cos((i/_numOfSubView)*M_PI*2+mStartAngle)*(self.frame.size.width/2-_subViewSize.width/2-20*Width);
UIButton *button=[btnArray objectAtIndex:i];
button.center=CGPointMake(xx, yy);
}
}
}
NSTimer *flowtime;
NSTimer *reverseTime;
float anglePerSecond;
float speed;? //轉(zhuǎn)動(dòng)速度
#pragma mark - 轉(zhuǎn)動(dòng)手勢
-(void)zhuanPgr:(UIPanGestureRecognizer *)pgr
{
if(pgr.state==UIGestureRecognizerStateBegan){
kaiduImage.alpha = 1.0;
mTmpAngle = 0;
beginPoint=[pgr locationInView:self];
startTouchDate=[NSDate date];
}else if (pgr.state==UIGestureRecognizerStateChanged){
float StartAngleLast = mStartAngle;
movePoint= [pgr locationInView:self];
float start = [self getAngle:beginPoint];? //獲得起始弧度
float end = [self getAngle:movePoint];? ? //結(jié)束弧度
if ([self getQuadrant:movePoint] == 1 || [self getQuadrant:movePoint] == 4) {
mStartAngle += end - start;
mTmpAngle += end - start;
//? ? ? ? ? ? NSLog(@"第一、四象限____%f",mStartAngle);
} else
// 二洲鸠、三象限堂淡,色角度值是付值
{
mStartAngle += start - end;
mTmpAngle += start - end;
//? ? ? ? ? ? NSLog(@"第二、三象限____%f",mStartAngle);
//? ? ? ? ? ? NSLog(@"mTmpAngle is %f",mTmpAngle);
}
[self layoutBtn];
beginPoint=movePoint;
speed = mStartAngle - StartAngleLast;
NSTimeInterval time=[[NSDate date] timeIntervalSinceDate:startTouchDate];
anglePerSecond = mTmpAngle*50/ time;
}else if (pgr.state==UIGestureRecognizerStateEnded){
// 計(jì)算扒腕,每秒移動(dòng)的角度
NSTimeInterval time=[[NSDate date] timeIntervalSinceDate:startTouchDate];
anglePerSecond = mTmpAngle*50/ time;
// 如果達(dá)到該值認(rèn)為是快速移動(dòng)
if (anglePerSecond > 0) {
if (fabsf(anglePerSecond) > mFlingableValue && !_isPlaying) {//順時(shí)針
// post一個(gè)任務(wù)绢淀,去自動(dòng)滾動(dòng)
_isPlaying = true;
flowtime = [NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(flowAction)
userInfo:nil
repeats:YES];
}
}else{
if (-fabsf(anglePerSecond) < -mFlingableValue && !_isPlaying) {//逆時(shí)針
_isPlaying = true;
reverseTime = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(reverseAction) userInfo:nil repeats:YES];
}
}
NSLog(@"%f-----!!!!!!!!!!!",mStartAngle);
//wxb 非快速滑動(dòng)停止時(shí)
if (_isPlaying==false)
{
if (mStartAngle>=0)
{
if (fmod(mStartAngle, M_PI*2)>M_PI_2*2.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*3+M_PI_2*0.32) {
mStartAngle = M_PI_2*3;
[self layoutBtn];
self.clickSomeOne(@"100");
}
if (fmod(mStartAngle, M_PI*2)>M_PI_2*1.68+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*2.32+M_PI_2*0.32) {
mStartAngle = M_PI_2*2.32;
[self layoutBtn];
self.clickSomeOne(@"101");
}
if (fmod(mStartAngle, M_PI*2)>M_PI_2*1+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*1.68+M_PI_2*0.32) {
mStartAngle = M_PI_2*1.68;
[self layoutBtn];
self.clickSomeOne(@"102");
}
if (fmod(mStartAngle, M_PI*2)>M_PI_2*0.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*1+M_PI_2*0.32) {
mStartAngle = M_PI_2*1;
[self layoutBtn];
self.clickSomeOne(@"103");
}
if (fmod(mStartAngle, M_PI*2)>0&&fmod(mStartAngle, M_PI*2)<=M_PI_2*0.32+M_PI_2*0.32) {
mStartAngle = M_PI_2*0.32;
[self layoutBtn];
//? ? ? ? ? ? ? ? ? ? self.clickSomeOne(@"104");
}
if (fmod(mStartAngle, M_PI*2)-M_PI*2<=0&&fmod(mStartAngle, M_PI*2)-M_PI*2>=-M_PI_2*0.32*2) {
//? ? ? ? mStartAngle = M_PI_2*3.66;
mStartAngle = -M_PI_2*0.32;
[self layoutBtn];
self.clickSomeOne(@"105");
}
}
else
{
if (fmod(mStartAngle, M_PI*2)+M_PI*2>M_PI_2*2.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*3+M_PI_2*0.32) {
mStartAngle = M_PI_2*3;
[self layoutBtn];
self.clickSomeOne(@"100");
}
if (fmod(mStartAngle, M_PI*2)+M_PI*2>M_PI_2*1.68+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*2.32+M_PI_2*0.32) {
mStartAngle = M_PI_2*2.32;
[self layoutBtn];
self.clickSomeOne(@"101");
}
if (fmod(mStartAngle, M_PI*2)+M_PI*2>M_PI_2*1+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*1.68+M_PI_2*0.32) {
mStartAngle = M_PI_2*1.68;
[self layoutBtn];
self.clickSomeOne(@"102");
}
if (fmod(mStartAngle, M_PI*2)+M_PI*2>M_PI_2*0.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*1+M_PI_2*0.32) {
mStartAngle = M_PI_2*1;
[self layoutBtn];
self.clickSomeOne(@"103");
}
if (fmod(mStartAngle, M_PI*2)+M_PI*2>0+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*0.32+M_PI_2*0.32) {
mStartAngle = M_PI_2*0.32;
[self layoutBtn];
//? ? ? ? ? ? ? ? ? ? self.clickSomeOne(@"104");
}
if (fmod(mStartAngle, M_PI*2)<=0&&fmod(mStartAngle, M_PI*2)>=-M_PI_2*0.32*2) {
//? ? ? ? mStartAngle = M_PI_2*3.66;
mStartAngle = -M_PI_2*0.32;
[self layoutBtn];
self.clickSomeOne(@"105");
}
}
}
}
}
- (void)beginPlayMusic
{
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
if ([user boolForKey:@"voice"]) {
//播放音效
//1.獲得音效文件的全路徑
NSURL *soundUrl = [[NSBundle mainBundle] URLForResource:@"swipe.mp3" withExtension:nil];
//2.加載音效文件,創(chuàng)建音效ID(SoundID,一個(gè)ID對(duì)應(yīng)一個(gè)音效文件)
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundUrl, &soundID);
//把需要銷毀的音效文件的ID傳遞給它既可銷毀
AudioServicesPlaySystemSound(soundID);
}
}
//獲取當(dāng)前點(diǎn)弧度
-(float)getAngle:(CGPoint)point {
double x = point.x - mRadius;
double y = point.y - mRadius;
return (float) (asin(y / hypot(x, y)));
}
/**
* 根據(jù)當(dāng)前位置計(jì)算象限
*
* @param x
* @param y
* @return
*/
-(int) getQuadrant:(CGPoint) point {
int tmpX = (int) (point.x - mRadius);
int tmpY = (int) (point.y - mRadius);
if (tmpX >= 0) {
return tmpY >= 0 ? 1 : 4;
} else {
return tmpY >= 0 ? 2 : 3;
}
}
-(void)flowAction{
if (speed < 0.1) {
[UIView animateWithDuration:2 animations:^{
kaiduImage.alpha = 0;
} completion:^(BOOL finished) {
}];
_isPlaying = false;
[flowtime invalidate];
flowtime = nil;
//wxb
if (fmod(mStartAngle, M_PI*2)>M_PI_2*2.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*3+M_PI_2*0.32) {
mStartAngle = M_PI_2*3;
[self layoutBtn];
self.clickSomeOne(@"100");
}
if (fmod(mStartAngle, M_PI*2)>M_PI_2*1.68+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*2.32+M_PI_2*0.32) {
mStartAngle = M_PI_2*2.32;
[self layoutBtn];
self.clickSomeOne(@"101");
}
if (fmod(mStartAngle, M_PI*2)>M_PI_2*1+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*1.68+M_PI_2*0.32) {
mStartAngle = M_PI_2*1.68;
[self layoutBtn];
self.clickSomeOne(@"102");
}
if (fmod(mStartAngle, M_PI*2)>M_PI_2*0.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*1+M_PI_2*0.32) {
mStartAngle = M_PI_2*1;
[self layoutBtn];
self.clickSomeOne(@"103");
}
if (fmod(mStartAngle, M_PI*2)>0&&fmod(mStartAngle, M_PI*2)<=M_PI_2*0.32+M_PI_2*0.32) {
mStartAngle = M_PI_2*0.32;
[self layoutBtn];
//? ? ? ? ? ? self.clickSomeOne(@"104");
}
if (fmod(mStartAngle, M_PI*2)-M_PI*2<=0&&fmod(mStartAngle, M_PI*2)-M_PI*2>=-M_PI_2*0.32*2) {
//? ? ? ? mStartAngle = M_PI_2*3.66;
mStartAngle = -M_PI_2*0.32;
[self layoutBtn];
self.clickSomeOne(@"105");
}
return;
}
// 不斷改變mStartAngle瘾腰,讓其滾動(dòng)皆的,/30為了避免滾動(dòng)太快
mStartAngle += speed ;
speed = speed/1.1;
// 逐漸減小這個(gè)值
//? ? anglePerSecond /= 1.1;
NSLog(@"++ %f--%f",mStartAngle,speed);
[self layoutBtn];
}
- (void)reverseAction
{
//? ? NSLog(@"%f",speed);
if (speed > -0.1) {
[UIView animateWithDuration:2 animations:^{
kaiduImage.alpha = 0;
} completion:^(BOOL finished) {
}];
_isPlaying = false;
[reverseTime invalidate];
reverseTime = nil;
//wxb
if ((fmod(mStartAngle, M_PI*2)+M_PI*2>M_PI_2*2.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*3+M_PI_2*0.32)||(fmod(mStartAngle, M_PI*2)>M_PI_2*2.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*3+M_PI_2*0.32)) {
mStartAngle = M_PI_2*3;
[self layoutBtn];
self.clickSomeOne(@"100");
}
if ((fmod(mStartAngle, M_PI*2)+M_PI*2>M_PI_2*1.68+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*2.32+M_PI_2*0.32)||(fmod(mStartAngle, M_PI*2)>M_PI_2*1.68+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*2.32+M_PI_2*0.32)) {
mStartAngle = M_PI_2*2.32;
[self layoutBtn];
self.clickSomeOne(@"101");
}
if ((fmod(mStartAngle, M_PI*2)+M_PI*2>M_PI_2*1+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*1.68+M_PI_2*0.32)||(fmod(mStartAngle, M_PI*2)>M_PI_2*1+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*1.68+M_PI_2*0.32)) {
mStartAngle = M_PI_2*1.68;
[self layoutBtn];
self.clickSomeOne(@"102");
}
if ((fmod(mStartAngle, M_PI*2)+M_PI*2>M_PI_2*0.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*1+M_PI_2*0.32)||(fmod(mStartAngle, M_PI*2)>M_PI_2*0.32+M_PI_2*0.32&&fmod(mStartAngle, M_PI*2)<=M_PI_2*1+M_PI_2*0.32)) {
mStartAngle = M_PI_2*1;
[self layoutBtn];
self.clickSomeOne(@"103");
}
if ((fmod(mStartAngle, M_PI*2)+M_PI*2>0&&fmod(mStartAngle, M_PI*2)+M_PI*2<=M_PI_2*0.32+M_PI_2*0.32)||(fmod(mStartAngle, M_PI*2)>0&&fmod(mStartAngle, M_PI*2)<=M_PI_2*0.32+M_PI_2*0.32)) {
mStartAngle = M_PI_2*0.32;
[self layoutBtn];
//? ? ? ? ? ? self.clickSomeOne(@"104");
}
if (fmod(mStartAngle, M_PI*2)<=0&&fmod(mStartAngle, M_PI*2)>=-M_PI_2*0.32*2) {
//? ? ? ? mStartAngle = M_PI_2*3.66;
mStartAngle = -M_PI_2*0.32;
[self layoutBtn];
self.clickSomeOne(@"105");
}
return;
}
mStartAngle += speed;
speed = speed/1.1;
[self layoutBtn];
}
//按鈕的點(diǎn)擊回調(diào)
-(void)subViewOut:(UIButton *)button
{
//點(diǎn)擊
if(self.clickSomeOne){
self.clickSomeOne([NSString stringWithFormat:@"%ld",(long)button.tag]);
}
//? ? NSLog(@"快點(diǎn)播放,別要點(diǎn)我");
}