五个按钮保持等距的圆形旋转

Posted

技术标签:

【中文标题】五个按钮保持等距的圆形旋转【英文标题】:Circular Rotation Of five buttons maintaining equal distance 【发布时间】:2011-03-25 14:15:04 【问题描述】:

我想在半径为 100 的圆的圆周上旋转五个按钮(圆心为 (120,120),实际上是正方形视图的中心,即 240*240)。是否可以这样做,通过交互带有旋转的按钮和正确的外观。

我试过了'

x =  round(cx + redious * cos(angl));
y =  round(cy - redious * sin(angl));   

NSString *X=[NSString stringWithFormat:@"%f",x];
[xval addObject:[NSString stringWithFormat:@"%@",X]];
NSString *Y=[NSString stringWithFormat:@"%f",y];
[yval addObject:[NSString stringWithFormat:@"%@",Y]];'

计算点数和:

map.frame= CGRectMake([[fqx objectAtIndex:counter1]intValue],[[fqy objectAtIndex:counter1]intValue], 72, 37);   
website.frame= CGRectMake([[fqx objectAtIndex:counter2]intValue],[[fqy objectAtIndex:counter2]intValue], 72, 37);   
share.frame= CGRectMake([[fqx objectAtIndex:counter3]intValue],[[fqy objectAtIndex:counter3]intValue], 72, 37); 
slideShow.frame= CGRectMake([[fqx objectAtIndex:counter4]intValue],[[fqy objectAtIndex:counter4]intValue], 72, 37);' 

旋转但它会产生奇怪的路径..以三角形方式.. ('map','share','slideShow','website') 是我的按钮.. :P

【问题讨论】:

你的“角度”是径向的吗?它一定要是。 radAngl = 角度 / 180 * Pi。另外:不要将下一次迭代基于以前的坐标。只增加角度,使用初始位置计算位置。 不,这是我减一的角度 @vladimir:你能告诉我你是怎么做到的吗? :) @rptwsthi,选择您的代码并在问题编辑器中按“”按钮。或者只是将代码行缩进 4 个空格 做了什么?我还没有实现这样的事情,因此没有答案,但评论中的提示。我认为,您必须先深入研究数学。 【参考方案1】:

这太可爱了,不能错过,所以就在这里。此代码仅限于一个按钮旋转,但我怀疑您将无法将其扩展为多个(提示:使用一个 CADisplayLink 并在其中一次旋转所有按钮)。

- (void)setupRotatingButtons

    // call this method once; make sure "self.view" is not nil or the button 
    // won't appear. the below variables are needed in the @interface.
    // center: the center of rotation
    // radius: the radius
    // time:   a CGFloat that determines where in the cycle the button is located at
    //         (note: it will keep increasing indefinitely; you need to use 
    //         modulus to find a meaningful value for the current position, if
    //         needed)
    // speed:  the speed of the rotation, where 2 * M_PI is 1 lap a second
    // b:      the UIButton
    center = CGPointMake(100, 100);
    radius = 100;
    time = 0;
    speed = 2 * M_PI; // <-- will rotate CW 360 degrees per second (1 "lap"/s)

    b = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
    b.titleLabel.text = @"Hi";
    b.frame = CGRectMake(0.f, 0.f, 100, 50);
    // we get the center set right before we add subview, to avoid glitch at start
    [self continueCircling:nil]; 
    [self.view addSubview:b];
    [self.view bringSubviewToFront:b];
    CADisplayLink *dl = [CADisplayLink displayLinkWithTarget:self 
        selector:@selector(continueCircling:)];
    [dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

我们还需要实际的“continueCircling:”方法,很简单:

- (void)continueCircling:(CADisplayLink *)dl

    time += speed * dl.duration;
    b.center = CGPointMake(center.x + radius * cosf(time), 
                           center.y + radius * sinf(time));

我敢肯定还有其他更漂亮的方法可以解决这个问题,但上述方法至少有效。 :)

编辑:我忘了提,你需要添加 QuartzCore 框架和

#import <QuartzCore/QuartzCore.h> 

对于 CADisplayLink。

编辑 2:找到 PI 常数 (M_PI),因此将 3.1415 替换为该常数。

【讨论】:

是的,听起来应该可以。如果你想要相等的距离,你希望它们之间的每个“步骤”都是 2*PI 的除数。我确信 PI 作为常数在某处可用,但使用 3.1415 可能已经足够接近了。 嘿,我为剩下的 4 个做的是:c.center = CGPointMake(center.x + radius * cosf(time+1.3), center.y + radius * sinf(time+1.3));' d.center = CGPointMake(center.x + radius * cosf(time+2.6), center.y + radius * sinf(time+2.6)); e.center = CGPointMake(center.x + radius * cosf(time+3.9), center.y + radius * sinf(time+3.9)); f.center = CGPointMake(center.x + radius * cosf(time+5.2), center.y + radius * sinf(time+5.2));

以上是关于五个按钮保持等距的圆形旋转的主要内容,如果未能解决你的问题,请参考以下文章

圆形UICollectionview,如何保持所有单元格角度为0°

CSS3实战开发(圆形导航效果)

UITableViewCell 中的圆形按钮

如何设置 圆形ProgressBar不旋转

圆形物体旋转角度检测

可视化2D动画—cavas旋转的圈