0

私の見解には2つのテキストファイルがあります。テキストフィールドが押されると、UIPickerView または通常のキーボード (テキストファイルのタイプに応じて) が下から表示されます。UIScrollView は、ビュー内のすべてをラップします。
ViewController.h ファイルは次のようになります。

@interface MyViewController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UITextField *textNormal;
@property (weak, nonatomic) IBOutlet UITextField *textScroll;
@property UIPickerView * picker;

@end

キーボードまたはピッカービューが表示されているときにテキストフィールドを表示するために、スクロールビューにスクロールするコードをいくつか混ぜました。

ViewController.m ファイル:

@interface MyViewController ()

@property BOOL keyboardVisable;
@property CGPoint offset;
@property CGRect frame;
@property UIPickerView * picker;
@end

@implementation MyViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.keyboardVisable = NO;
    [[NSNotificationCenter defaultCenter]
     addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter]
     addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    tapGesture.cancelsTouchesInView = NO;
    [self.scrollView addGestureRecognizer:tapGesture];

    self.picker = [[UIPickerView alloc] init];
    self.textScroll.inputView = self.picker;
    self.picker.delegate = self;
    self.picker.dataSource = self;
    self.picker.showsSelectionIndicator = YES;

}
-(void)hideKeyboard
{
    NSLog(@"hide now");
    [self.scrollView endEditing:YES];
}


- (void)keyboardDidShow:(NSNotification *)notif{
    if(self.keyboardVisable)
        return;

    NSLog(@"keyboard did show");

    NSDictionary* info = [notif userInfo];
    NSValue* aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];
    CGSize keyboardSize = [aValue CGRectValue].size;

    // Save the current location so we can restore
    // when keyboard is dismissed
    self.offset = self.scrollView.contentOffset;
    self.frame = self.scrollView.frame;

    // Resize the scroll view to make room for the keyboard
    CGRect viewFrame = self.scrollView.frame;
    viewFrame.size.height -= keyboardSize.height;
    self.scrollView.frame = viewFrame;

    CGRect textFieldRect = [self.textScroll frame];
    textFieldRect.origin.y += 10;

    [self.scrollView scrollRectToVisible:textFieldRect animated:YES];

    // Keyboard is now visible
    self.keyboardVisable = YES;

}


- (void)keyboardDidHide:(NSNotification *)notif{
    if(!self.keyboardVisable)
        return;

    NSLog(@"keyboard did hide");


    //self.scrollView.contentOffset = self.offset;
    self.scrollView.frame = self.frame;
    [self.scrollView setContentOffset:self.offset animated:YES];

    self.keyboardVisable = NO;

}

これらのコードは、通常のテキスト フィールドが押されたときに正常に機能します。
(スクロールビューは、テキストフィールドを表示できるようにするためにフレームサイズとオフセットを変更し、キーボード以外の場所を押すと通常に戻ります)

ただし、inputView == pickerview のテキストフィールドでは機能しません。スクロールビューは、期待どおりにフレームサイズを変更します。ユーザーがピッカービューをスクロールすると、背景 (scrollview) が突然上にスクロールし、予期せずスクロールできなくなります。

ありがとう!

4

0 に答える 0