2

プログラムでいくつかのテキスト フィールドを作成しようとしています。それらは画面の下部に表示され、選択するとキーボードがそれらを覆います。テキストフィールドが選択されているときにビューを上に移動する必要があります。

ビューのコードは次のとおりです。

ヘッダ:

@interface MESLoginViewController : UIViewController <PFLogInViewControllerDelegate, UITextFieldDelegate> {
    IBOutlet UITextField *usernameField;
}

インプ ビュー ファイル:

// Create sub view for Logo
    UIView *logoView =[[UIView alloc] initWithFrame:CGRectMake(0,0,320,280)];
    [logoView setBackgroundColor:[UIColor blueColor]];
    logoView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

    // Create sub view for fields
    UIView *fieldView = [[UIView alloc] initWithFrame:CGRectMake(0, logoView.bounds.size.height, 320, 200)];
    [fieldView setBackgroundColor:[UIColor greenColor]];
    fieldView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin;

    // Setting up the text fields
    // Username field
    usernameField = [[UITextField alloc] initWithFrame:CGRectMake(10, 20, 300, 40)];
    usernameField.borderStyle = UITextBorderStyleRoundedRect;
    usernameField.textColor = [UIColor blackColor];
    usernameField.font = [UIFont systemFontOfSize:17.0];
    usernameField.placeholder = @"Username";
    usernameField.backgroundColor = [UIColor whiteColor];
    usernameField.autocorrectionType = UITextAutocorrectionTypeNo;
    usernameField.keyboardType = UIKeyboardTypeDefault;
    usernameField.returnKeyType = UIReturnKeySearch;
    usernameField.clearButtonMode = UITextFieldViewModeWhileEditing;
    usernameField.delegate = self;

    // Password field
    UITextField *passwordField = [[UITextField alloc] initWithFrame:CGRectMake(10, (usernameField.bounds.size.height + 30), 300, 40)];
    passwordField.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin;
    passwordField.borderStyle = UITextBorderStyleRoundedRect;
    passwordField.textColor = [UIColor blackColor];
    passwordField.font = [UIFont systemFontOfSize:17.0];
    passwordField.placeholder = @"Password";
    passwordField.backgroundColor = [UIColor whiteColor];
    passwordField.autocorrectionType = UITextAutocorrectionTypeNo;
    passwordField.keyboardType = UIKeyboardTypeDefault;
    passwordField.returnKeyType = UIReturnKeySearch;
    passwordField.clearButtonMode = UITextFieldViewModeWhileEditing;
    passwordField.delegate = self;

    // Add fields/button to fieldView
    [fieldView addSubview:usernameField];
    [fieldView addSubview:passwordField];

    // Add subviews to main view
    [self.view addSubview:logoView];
    [self.view addSubview:fieldView];

ビューを移動するためにこのメソッドを追加しましたが、最後の部分を正しく処理できません:

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    NSLog(@"textFieldDidBeginEditing");
    //If we begin editing on the text field we need to move it up to make sure we can still
    //see it when the keyboard is visible.
    //I am adding an animation to make this look better
    [UIView beginAnimations:@"Animate Text Field Up" context:nil];
    [UIView setAnimationDuration:.3];
    [UIView setAnimationBeginsFromCurrentState:YES];

    usernameField.frame = CGRectMake(usernameField.frame.origin.x,
                                        -200,
                                        usernameField.frame.size.width,
                                        usernameField.frame.size.height);

    [UIView commitAnimations];

}

私が実際に探しているのは、ビューを完全にシフトするか、上のスクロール可能な領域に変更することです。touch to endEditing の後に別のメソッドを実装していますが。

1 つのフィールドを移動する場合、すべてを移動するにはコードを完成させる必要があるようです... ビュー (完全なビュー) を移動するにはどうすればよいですか?

また、メソッド textFieldDidEndEditing|textFieldShouldEndEditing でビューを通常の状態に戻すには何が必要ですか?

4

4 に答える 4

0

私の理解が正しければ、実際には「fieldView」をシフトしたいのですが、2 つの UITextFields はこのビューのサブビューであるためです。

そのエラーをスローしている理由は、そのメソッドで変数にアクセスできないためです。ヘッダー ファイルでインスタンス変数を宣言する必要があります。

于 2013-02-13T17:02:16.943 に答える
0

usernameFieldあなたは私の友人のメソッドでローカル変数にアクセスしています。それがコンパイルエラーです。

于 2013-02-13T16:55:13.560 に答える
0

キーボードが選択された後にアニメーション化する場合は、代わりにビュー全体をアニメーション化します。

最初に UIView 変数を宣言して、アクセスできるようにします。

@interface MESLoginViewController : UIViewController <PFLogInViewControllerDelegate, UITextFieldDelegate> 
{ 
IBOutlet UITextField *usernameField; 
UIView *fieldView; 
}

次に、実装でこのビューを作成します

 // Create sub view for Logo
UIView *logoView =[[UIView alloc] initWithFrame:CGRectMake(0,0,320,280)];
[logoView setBackgroundColor:[UIColor blueColor]];
logoView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

// Create sub view for fields
fieldView = [[UIView alloc] initWithFrame:CGRectMake(0, logoView.bounds.size.height, 320, 200)];
[fieldView setBackgroundColor:[UIColor greenColor]];
fieldView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin;

// Setting up the text fields
// Username field
usernameField = [[UITextField alloc] initWithFrame:CGRectMake(10, 20, 300, 40)];
usernameField.borderStyle = UITextBorderStyleRoundedRect;
usernameField.textColor = [UIColor blackColor];
usernameField.font = [UIFont systemFontOfSize:17.0];
usernameField.placeholder = @"Username";
usernameField.backgroundColor = [UIColor whiteColor];
usernameField.autocorrectionType = UITextAutocorrectionTypeNo;
usernameField.keyboardType = UIKeyboardTypeDefault;
usernameField.returnKeyType = UIReturnKeySearch;
usernameField.clearButtonMode = UITextFieldViewModeWhileEditing;
usernameField.delegate = self;

// Password field
UITextField *passwordField = [[UITextField alloc] initWithFrame:CGRectMake(10, (usernameField.bounds.size.height + 30), 300, 40)];
passwordField.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleTopMargin;
passwordField.borderStyle = UITextBorderStyleRoundedRect;
passwordField.textColor = [UIColor blackColor];
passwordField.font = [UIFont systemFontOfSize:17.0];
passwordField.placeholder = @"Password";
passwordField.backgroundColor = [UIColor whiteColor];
passwordField.autocorrectionType = UITextAutocorrectionTypeNo;
passwordField.keyboardType = UIKeyboardTypeDefault;
passwordField.returnKeyType = UIReturnKeySearch;
passwordField.clearButtonMode = UITextFieldViewModeWhileEditing;
passwordField.delegate = self;

// Add fields/button to fieldView
[fieldView addSubview:usernameField];
[fieldView addSubview:passwordField];

// Add subviews to main view
[self.view addSubview:logoView];
[self.view addSubview:fieldView];

次に、代わりに fieldView をアニメーション化します。

- (void)textFieldDidBeginEditing:(UITextField *)textField{
NSLog(@"textFieldDidBeginEditing");
//If we begin editing on the text field we need to move it up to make sure we can still
//see it when the keyboard is visible.
//I am adding an animation to make this look better
[UIView beginAnimations:@"Animate Text Field Up" context:nil];
[UIView setAnimationDuration:.3];
[UIView setAnimationBeginsFromCurrentState:YES];

fieldView.frame = CGRectMake(fieldView.frame.origin.x,
                                    -200,
                                    fieldView.frame.size.width,
                                    fieldView.frame.size.height);

[UIView commitAnimations];

}

すべてのテキスト フィールドは fieldView のサブビューであるため、アニメーション化されます。それはそれをソートする必要があります!

于 2013-02-18T21:53:26.167 に答える