0

私は初心者としてiPhoneアプリを開発しています。私は動的に UItextFields を作成します

for (int i = 0; i <= currentAnswerLen; i++) {
    [textField4 setTag:i];
    textField4 = [[UITextField alloc] initWithFrame:CGRectMake((50 + (i * 40)), 180, 30, 35)];
etc.......
}

問題は、フィールドをクリックするとキーボードが表示され、テキストフィールドが表示されないことです。キーボードが表示されます。キーボードが表示されたときにテキストフィールドの位置を変更するにはどうすればよいですか?

事前に感謝します。

4

2 に答える 2

1

Xib に UIScrollView を追加し、動的に作成しているすべてのラベルを追加する IBOutlet 接続を作成します。私はあなたのコードにいくつかの変更を加えました。その正常に動作します。

-(void)setAnswerField
{
    int len = 10;
    int commonSpace = 20;
    for (int i=0;i<=len;i++)
    {
        if(i != 0)
            commonSpace += 40;
        textF=[[UITextField alloc] initWithFrame:CGRectMake(((i * 60))+commonSpace,180,60,35)];
        [textF setTag:i];
        [textF setDelegate:self];
        [textF setReturnKeyType:UIReturnKeyDone];
        [textF setBackgroundColor:[UIColor grayColor]];
        [textF addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];
        textF.clearButtonMode=UITextFieldViewModeWhileEditing;
        [textF addTarget:self action:@selector(keyDown:)forControlEvents:UIControlEventEditingDidEndOnExit];
        [_textfieldsScrollView addSubview:textF];
    }

     _textfieldsScrollView.contentSize=CGSizeMake(1000, 500);
}

テキストフィールド textViewDidBeginEditing method fire をクリックしながら、コンテンツのオフセット値を次のように変更するだけです。

- (void)textViewDidBeginEditing:(UITextView *)textView
{

        [_textfieldsScrollView setContentSize:CGSizeMake(320, 400)];
        [_textfieldsScrollView setContentOffset:CGPointMake(0, 100) animated:YES];

}

その後、このように元の位置に戻します。

- (void)textViewDidEndEditing:(UITextView *)textView
{
    //Back to normal state. 
    [_textfieldsScrollView setContentOffset:CGPointMake(0, 0) animated:YES];    
}
于 2013-03-28T14:35:15.863 に答える
0

インターフェイスにこの変数を追加します

@interface example : UIViewController
{
    CGFloat animatedDistance;

}

実装クラスにこれを追加します

static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3;
static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2;
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8;
static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216;
static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 162;

次に、これら 2 つのデリゲート メソッドを追加します。

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
    CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];

    CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height;
    CGFloat numerator = midline - viewRect.origin.y - MINIMUM_SCROLL_FRACTION * viewRect.size.height;
    CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewRect.size.height;
    CGFloat heightFraction = numerator / denominator;

    if (heightFraction < 0.0)
    {
        heightFraction = 0.0;
    }
    else if (heightFraction > 1.0)
    {
        heightFraction = 1.0;
    }

    UIInterfaceOrientation orientation =
    [[UIApplication sharedApplication] statusBarOrientation];
    if (orientation == UIInterfaceOrientationPortrait ||
        orientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
    }
    else
    {
        animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction);
    }

    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y -= animatedDistance;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];

    [self.view setFrame:viewFrame];

    [UIView commitAnimations];

}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y += animatedDistance;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];

    [self.view setFrame:viewFrame];

    [UIView commitAnimations];

}

次に、textField デリゲートを設定することを忘れないでください。

于 2013-03-28T15:49:15.663 に答える