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;

これにより、ラベルが表示される円上のポイントが得られます。

注意:次のラベルを正しい位置に移動するには、 anglebyを掛ける必要があります。i角度を計算するときに、最後のラベルが最初のラベルと重ならないように、配列カウントに 1 を追加する必要がある場合もあります。

出典:ウィキペディア

于 2012-12-19T19:17:39.163 に答える
1

これはコードの質問というよりは数学の質問ですが、突き刺します。

最初のアイテムを一番上に置き、メイン画像の周りにアイテムを時計回りに配置すると仮定すると、for ループを通過するときに 1 つの変数、つまり角度を変更することになります。

次に、角度と半径 (一定である可能性が高い) をデカルト座標に変換し、その結果を画像の中心の座標に追加することにより、各反復で 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 に答える