我在屏幕中央有一个圆圈,我在这个固定圆圈(UIImageView)周围分配了一系列UIlabels。标签的数量由NSMutableArray中的元素数量给出,标签的位置取决于标签的数量。我不能给标签提供固定的x和y坐标,因为标签的数量会有所不同。
我尝试使用此代码:
- (void)loadContent{
NSString *filename6 = [[NSUserDefaults standardUserDefaults]objectForKey:@"Setting"];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *groupPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", filename6]];
NSString *fileContent = [[NSString alloc] initWithContentsOfFile:groupPath];
NSMutableArray* array = [[NSMutableArray alloc] initWithArray:[fileContent componentsSeparatedByString:@", "]];
int arrayCount = array.count;
int yCoordinate = (2*M_PI) / arrayCount;
int xCoordinate = ;
for(int i = 0; i < [array count]; i++){
CGRect textframe = CGRectMake( the xcoordinate, the ycoordinate, 328, 30);
NSString *nameOfGroup = [array objectAtIndex:i];
UITextView* theGroupTextLabel;
theGroupTextLabel = [[UITextView alloc] initWithFrame: textframe];
[theGroupTextLabel setText: nameOfGroup];
[theGroupTextLabel setTextColor: [UIColor redColor]];
[self.view addSubview:theGroupTextLabel];
//theGroupTextLabel.enabled = NO;
theGroupTextLabel.backgroundColor = [UIColor clearColor];
theGroupTextLabel.layer.borderWidth = 3.5f;
theGroupTextLabel.layer.borderColor = [[UIColor blackColor] CGColor];
int z;
z = z + 1;
theGroupTextLabel.tag = z;
}
}
但我仍然坚持找到正确的等式:
int yCoordinate = (2*M_PI) / arrayCount;
int xCoordinate = ;
...坐标。有任何想法吗?这是我正在使用的正确方法吗?
答案 0 :(得分:2)
处理圆时,你的X和Y坐标是(cos angle, sin angle)
,所以为了弄清你的x和y坐标,你应该做类似下面的事情
float angle = (2*M_PI) / arrayCount;
int xCoordinate = (cos(angle * i) * circleRadius) + circleCenterX;
int yCoordinate = (sin(angle * i) * circleRadius) + circleCenterY;
这将为您提供标签应显示的圆圈上的点。
N.B。您需要将angle
乘以i
才能将下一个标签移至正确的位置。在计算角度时,您可能还需要在数组计数中加1,以防止最后一个与第一个标签重叠。
来源:Wikipedia
答案 1 :(得分:1)
这是一个数学问题,而不是一个代码问题,但我会采取刺。
假设您希望第一个项目位于顶部,然后顺时针将项目放在主图像周围,那么当您通过for循环时,您将改变一个变量:角度。
然后,通过将角度和半径(可能是常数)转换为笛卡尔坐标,并将结果添加到图像中心的坐标,计算每次迭代中的x和y坐标。这需要在for循环中完成,而不是在代码中使用它。
在循环的每次迭代中,您将添加到角度的数量为2*M_PI / arrayCount
。
这正是我的想法:
- (void)loadContent{
NSString *filename6 = [[NSUserDefaults standardUserDefaults]objectForKey:@"Setting"];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *groupPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", filename6]];
NSString *fileContent = [[NSString alloc] initWithContentsOfFile:groupPath];
NSMutableArray* array = [[NSMutableArray alloc] initWithArray:[fileContent componentsSeparatedByString:@", "]];
int arrayCount = array.count;
CGFloat radius = 300;// <--- INSERT RADIUS HERE
CGFloat angle = 0;// <--- The starting angle
CGPoint center = CGPointMake(300,300); // <--- INSERT CENTER OF ARRANGEMENT
for(int i = 0; i < [array count]; i++){
int yCoordinate = radius * cos(angle) + center.y;
int xCoordinate = radius * sin(angle) + center.x;
CGRect textframe = CGRectMake( the xcoordinate, the ycoordinate, 328, 30);
NSString *nameOfGroup = [array objectAtIndex:i];
UITextView* theGroupTextLabel;
theGroupTextLabel = [[UITextView alloc] initWithFrame: textframe];
[theGroupTextLabel setText: nameOfGroup];
[theGroupTextLabel setTextColor: [UIColor redColor]];
[self.view addSubview:theGroupTextLabel];
//theGroupTextLabel.enabled = NO;
theGroupTextLabel.backgroundColor = [UIColor clearColor];
theGroupTextLabel.layer.borderWidth = 3.5f;
theGroupTextLabel.layer.borderColor = [[UIColor blackColor] CGColor];
int z;
z = z + 1;
theGroupTextLabel.tag = z;
// INCREMENT ANGLE
angle += 2 * M_PI / array.count;
}
}