五个按钮保持等距的圆形旋转
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));
以上是关于五个按钮保持等距的圆形旋转的主要内容,如果未能解决你的问题,请参考以下文章