一個自定義的圓環,可轉動,給每個按鈕添加跳轉或者事件,自己加了一些點擊時播放系統的聲音和振動,直接上代碼,粘貼復制可用:
.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];
//設置image在button上的位置(上top,左left,下bottom,右right)這里可以寫負值,對上寫-5,那么image就象上移動5個像素
[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];
//加轉動手勢
_pgr=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(zhuanPgr:)];
[_circleView addGestureRecognizer:_pgr];
//加點擊效果
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圓環按鈕點擊了",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.加載音效文件,創建音效ID(SoundID,一個ID對應一個音效文件)
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundUrl, &soundID);
//把需要銷毀的音效文件的ID傳遞給它既可銷毀
AudioServicesPlaySystemSound(soundID);
}
if ([user boolForKey:@"vibration"]) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
}
//點擊圓心按鈕
- (void)clickBtnCenter:(UIButton *)btnCenter
{
NSLog(@"圓心按鈕點擊了");
}
//按鈕布局
-(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;? //轉動速度
#pragma mark - 轉動手勢
-(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];? ? //結束弧度
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){
// 計算,每秒移動的角度
NSTimeInterval time=[[NSDate date] timeIntervalSinceDate:startTouchDate];
anglePerSecond = mTmpAngle*50/ time;
// 如果達到該值認為是快速移動
if (anglePerSecond > 0) {
if (fabsf(anglePerSecond) > mFlingableValue && !_isPlaying) {//順時針
// post一個任務,去自動滾動
_isPlaying = true;
flowtime = [NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(flowAction)
userInfo:nil
repeats:YES];
}
}else{
if (-fabsf(anglePerSecond) < -mFlingableValue && !_isPlaying) {//逆時針
_isPlaying = true;
reverseTime = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(reverseAction) userInfo:nil repeats:YES];
}
}
NSLog(@"%f-----!!!!!!!!!!!",mStartAngle);
//wxb 非快速滑動停止時
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.加載音效文件,創建音效ID(SoundID,一個ID對應一個音效文件)
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundUrl, &soundID);
//把需要銷毀的音效文件的ID傳遞給它既可銷毀
AudioServicesPlaySystemSound(soundID);
}
}
//獲取當前點弧度
-(float)getAngle:(CGPoint)point {
double x = point.x - mRadius;
double y = point.y - mRadius;
return (float) (asin(y / hypot(x, y)));
}
/**
* 根據當前位置計算象限
*
* @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,讓其滾動,/30為了避免滾動太快
mStartAngle += speed ;
speed = speed/1.1;
// 逐漸減小這個值
//? ? 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];
}
//按鈕的點擊回調
-(void)subViewOut:(UIButton *)button
{
//點擊
if(self.clickSomeOne){
self.clickSomeOne([NSString stringWithFormat:@"%ld",(long)button.tag]);
}
//? ? NSLog(@"快點播放,別要點我");
}