1

我在屏幕的中心有一个圆圈,我在这个固定的圆圈(一个 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 = ;

...坐标。有任何想法吗?这是我使用的正确方法吗?

4

2 回答 2

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;

这将为您提供标签应出现的圆圈上的点。

注意,您需要乘以将anglei一个标签移动到正确的位置。在计算角度时,您可能还必须将数组计数加 1,以防止最后一个与第一个标签重叠。

资料来源:维基百科

于 2012-12-19T19:17:39.163 回答
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;
 }
}
于 2012-12-19T19:16:20.117 回答