这是UIControl
的子类,我使用touches方法获取圆周上的点。
我成功地获得了精确的角度,因此得到了最外圈圆周上的精确点。
但我想在同心圆的顶部放置一个按钮,使其直径= distance_between_concentric_circles + 2 * offset。
使用此偏移使按钮边缘应位于同心圆区域之外,如下图所示。
每次移动该按钮时,它都应该沿着圆形路径移动。
由于我不想画画,我正在使用UIButton
和图像视图,而我发现很难根据外围圆周上的点来获得左上角坐标圈子和UIButton
的大小。
我可以移动按钮,但没有正确放置在圆形路径上。
有人能告诉我是否有办法让左上方的坐标设置uibutton的框架?
我想在不画画的情况下这样做。
答案 0 :(得分:1)
不用担心左上角可能更容易,而只是设置按钮的center
属性(而不是frame
属性)。计算左上角的偏移量并不难,但调整center
属性更直观,恕我直言。
或者,如果您不想调整center
或frame
坐标,可以使用Quartz 2D在屏幕上的某个点旋转按钮:
更改按钮的anchorPoint
;
将按钮的position
设置为您要旋转的点(并且因为您设置了anchorPoint
,按钮将与position
正确偏移1}});以及
围绕该锚点旋转它。
所以,如果你link the QuartzCore.framework to your project,那么你可以:
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CFTimeInterval startTime;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self rotateButtonAroundPoint];
}
- (void)rotateButtonAroundPoint
{
// the point about which I'm rotating and at what radius
CGPoint center = CGPointMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0);
CGFloat radius = 100.0;
// now configure the button's layer accordingly
self.button.layer.anchorPoint = CGPointMake(0.5, 0.5 + radius / self.button.frame.size.height);
self.button.layer.position = center;
// just so I can see what I'm rotating this around
[self addCircleAt:center radius:5.0 color:[UIColor redColor]];
// turn on display link to animate it (better than `NSTimer` for animations)
[self startDisplayLink];
}
- (void)addCircleAt:(CGPoint)center radius:(CGFloat)radius color:(UIColor *)color
{
CAShapeLayer *layer = [CAShapeLayer layer];
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:0 endAngle:2.0 * M_PI clockwise:YES];
layer.path = [path CGPath];
layer.fillColor = [color CGColor];
[self.view.layer addSublayer:layer];
}
- (void)startDisplayLink
{
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
self.startTime = CACurrentMediaTime();
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)stopDisplayLink
{
[self.displayLink invalidate];
self.displayLink = nil;
}
- (void)handleDisplayLink:(CADisplayLink *)displayLink
{
CFTimeInterval elapsed = CACurrentMediaTime() - _startTime;
self.button.transform = CGAffineTransformMakeRotation(elapsed * 2.0 * M_PI / 5.0); // duration = 5.0 seconds
}
我怀疑只是更改center
/ frame
或进行翻译(而不是这种旋转)可能在计算上更便宜,但如果您希望按钮在旋转时实际旋转,这是一个选项,它享有一定的优雅(只需设置position
和anchorPoint
并围绕它旋转,不要担心笛卡尔坐标。
答案 1 :(得分:0)
圆心圆周上以中心为原点的任何点都由(r*cos(theta),r*sin*(theta))
表示
除了原点,圆周上的任何点都是(x+r*cos(theta),y+r*sin*(theta))
(x,y)
将成为圆圈的中心,因此请计算(x+r*cos(theta),y+r*sin*(theta))
并设置按钮中心