0

単語があり、その長さに応じて、単語からランダムに文字を割り当てるボタンを作成します。シャッフルされた文字ボタンの配置を一列に表示しています。これらのボタンの位置を 1 番目から 3 番目に並べ替えたいと思います。 3番目から5番目などです。ボタンの数は固定ではなく、単語の長さによって異なります。ボタンの作成方法を理解するためのサンプルコードスニペットを次に示します。

-(void)buttonsCreation:(int)noOfButtons
{
    NSMutableArray *charactersArray = [NSMutableArray array];
    self.wordButtons = [[NSMutableArray alloc]initWithCapacity:30];

    BOOL record = NO;
    int randomNumber;
    self.jumbledWord = [jumbledWord stringByReplacingOccurrencesOfString:@" " withString:@""];

    for (int i=0; [charactersArray count] < jumbledWord.length; i++) //Loop for generate different random values
    {
        randomNumber = arc4random() % jumbledWord.length;//generating random number
        if(i==0)
        {
            [charactersArray addObject:[NSNumber numberWithInt:randomNumber]];
        }
        else
        {
            for (int j=0; j<= [charactersArray count]-1; j++)
            {
                if (randomNumber ==[[charactersArray objectAtIndex:j] intValue])
                    record = YES;
            }
            if (record == YES)
                record = NO;
            else
                [charactersArray addObject:[NSNumber numberWithInt:randomNumber]];
        }
    }

    int arrayValue;
    float x;
    float y;

    if ([jumbledWord length]>11)
    {
        int remainingWordslength = [jumbledWord length]-11;
        x = ((475/2) - (38.0 *(11/2.0))) + 8;
        y = ((475/2) - (38.0 *(remainingWordslength/2.0))) + 8;

    }
    else
    {
        x = ((475/2) - (38.0 *([jumbledWord length]/2.0))) + 8;
    }

    for(int i=0;i<[jumbledWord length];i++)
    {
        CGFloat translation = 0.0;

        if(i>=0 && i<11)
        {
            arrayValue = [[charactersArray objectAtIndex:i] intValue];
            UIButton *characterButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            characterButton.frame = CGRectMake(x,160.0, 35.0, 35.0);
            x = x + 38;

            if (jumbledWord.length>=1 && jumbledWord.length<5)
            {
                translation = (self.view.frame.size.width - characterButton.frame.size.width)+65.0;
            }
            if (jumbledWord.length>=5 && jumbledWord.length<11)
            {
                translation = (self.view.frame.size.width - characterButton.frame.size.width)+160.0;
            }
            characterButton.transform = CGAffineTransformMakeTranslation(translation, 0);
            [UIView animateWithDuration:1.30f
                                  delay:0.7
                                options:UIViewAnimationOptionTransitionFlipFromRight
                             animations:^{
                                 characterButton.transform = CGAffineTransformIdentity;
                             } completion:^(BOOL finished) {
                             }];
            [wordButtons addObject:characterButton];
            NSString *characterValue = [NSString stringWithFormat:@"%c",[jumbledWord characterAtIndex:arrayValue]];
            [characterButton setTitle:characterValue forState:UIControlStateNormal];
            [characterButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
            if (arrayValue==0)
            {
                arrayValue = 100;
            }
            [characterButton setTag:arrayValue*100];
            [self.view addSubview:characterButton];
        }
        else if(i>=11 && i<20)
        {
            arrayValue = [[charactersArray objectAtIndex:i] intValue];
            UIButton *characterButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            characterButton.frame = CGRectMake(y,200.0, 35.0, 35.0);
            y = y + 38;

            if (jumbledWord.length>=11 && jumbledWord.length<15)
            {
                translation = (self.view.frame.size.width - characterButton.frame.size.width)+70.0;
            }
            if (jumbledWord.length>=15 && jumbledWord.length<=20)
            {
                translation = (self.view.frame.size.width - characterButton.frame.size.width)+150.0;
            }
            characterButton.transform = CGAffineTransformMakeTranslation(translation, 0);
            [UIView animateWithDuration:1.30f
                                  delay:0.7
                                options:UIViewAnimationOptionTransitionFlipFromRight
                             animations:^{
                                 characterButton.transform = CGAffineTransformIdentity;
                             } completion:^(BOOL finished) {
                             }];

            [wordButtons addObject:characterButton];
            NSString *characterValue = [NSString stringWithFormat:@"%c",[jumbledWord characterAtIndex:arrayValue]];
            [characterButton setTitle:characterValue forState:UIControlStateNormal];
            [characterButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
            if (arrayValue==0)
            {
                arrayValue = 100;
            }
            [characterButton setTag:arrayValue*100];
            [self.view addSubview:characterButton];
        }
    }
}

理想的な選択は、フレーム、つまりボタンの「x」位置を割り当てることですが、これを行うにはどうすればよいかを認識しています。他のオプションは、インデックス位置を交換することであり、私も試しました。

-(void)shuffleButtons
{
    for (UIButton *characterButton in wordButtons)
    {
        id sortObject1 = [self.wordButtons objectAtIndex:0];
        id sortObject1 = [self.wordButtons objectAtIndex:1];
        id sortObject1 = [self.wordButtons objectAtIndex:2];
        [self.wordButtons removeObjectAtIndex:0];
        [self.wordButtons removeObjectAtIndex:1];
        [self.wordButtons insertObject:characterButton atIndex:1];
        [self.wordButtons insertObject:characterButton atIndex:0];
        [self.wordButtons removeObjectAtIndex:2];
        [self.wordButtons insertObject:characterButton atIndex:1];
    }
}

おっと、それはクラッシュします。誰かが私に道を案内してください。ユーザーが単語のごちゃごちゃした配置をシャッフルするオプションがあるため、達成する必要があります。

前もって感謝します :)

4

2 に答える 2

1

wordButtons 配列にすべてのボタンがあるため、これらのインデックスの場所を利用して、小さなアニメーションで場所を交換できます;)、つまり

- (void)exchangeButtons
{
   UIButton *firstButton = self.wordButtons[0];
   UIButton *lastButton = self.wordButtons[self.wordButtons.count - 1];
   UIButton *secondButton = self.wordButtons[1];
   UIButton *thirdButton = self.wordButtons[2];
   [self exchangeButton:firstButton withAnother:lastButton];
   [self exchangeButton:secondButton withAnother:thirdButton];
}

//Animate buttons while interchanging positions
- (void)exchangeButton:(UIButton *)firstButton withAnother:(UIButton *)secondButton
{
    CGRect firstButtonFrame = firstButton.frame; [UIView animateWithDuration:1.0f animations:^{ firstButton.frame = secondButton.frame; secondButton.frame = firstButtonFrame; }];
}

交換ボタンのコードは異なる場合があることに注意してください。すべて単語の長さ、つまりボタンの数によって異なります。そのため、ボタンのインデックスを交換する前に、if(wordButtons.count >= 6) または >=10などの条件を設定できます。 .

PS --より効果的でハードコードされていないソリューション

ボタンの行を作成するときにボタンのフレームを保存し、それを使用してボタンの位置を交換します。つまり、作成中にボタンフレームを宣言されたCGRectオブジェクトに割り当てます。

CGRect originalFrameArray[16]; --> **Global variable**
originalFrameArray[i] = characterButton.frame;

次に、2 つの配列を作成しましょう。1 つは単語をシャッフルして文字ボタンのインデックスを格納するためのもので、もう 1 つはボタン配列を変更するためのもので、小さなアニメーションでボタンの交換を開始します :)

- (void)exchangeButtons
{
    NSMutableArray *charactersArray = [NSMutableArray array];
    NSMutableArray *copyOfButtons = [NSMutableArray arrayWithArray:wordButtons];

    BOOL record = NO;
    int randomNumber;

    for (int i=0; [charactersArray count] < jumbledWord.length; i++) //Loop for generate different random values
    {
        randomNumber = arc4random() % jumbledWord.length;//generating random number
        if(i==0)
        {
            [charactersArray addObject:[NSNumber numberWithInt:randomNumber]];
        }
        else
        {
            for (int j=0; j<= [charactersArray count]-1; j++)
            {
                if (randomNumber ==[[charactersArray objectAtIndex:j] intValue])
                    record = YES;
            }
            if (record == YES)
                record = NO;
            else
                [charactersArray addObject:[NSNumber numberWithInt:randomNumber]];
        }
    }

    int arrayValue;

    for(int i=0;i<[jumbledWord length];i++)
    {
        arrayValue = [[charactersArray objectAtIndex:i] intValue];
        [wordButtons replaceObjectAtIndex:arrayValue withObject:[copyOfButtons objectAtIndex:i]];
    }
    for(int i=0; i < [jumbledWord length]; i++)
    {
        UIButton *characterButton = [wordButtons objectAtIndex:i];
        [self shiftButtonToFrame:characterButton :originalFrameArray[i]];
    }
}

//Animate the buttons while they exchange positions
- (void) shiftButtonToFrame:(UIButton *) characterButton :(CGRect) frame
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:1.0];
    [characterButton setFrame:frame];
    [UIView commitAnimations];
}

それが誰かに役立つことを願っています.Thanksと幸せなコーディング:)

于 2013-07-24T10:25:45.130 に答える