在特定位置分配UITextViews

时间:2012-12-19 19:05:06

标签: ios xcode

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

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

2 个答案:

答案 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;
 }
}