ユーザー入力を受け取るためにUITextFieldを使用しています。ただし、テキストフィールドはペン先の中央/下部にあるため、キーボードがポップアップすると非表示になります。キーボードと一緒にスライドさせて、選択時にキーボードの上部に配置する方法はありますか?また、テンキーも使用しているので、どこかに完了ボタンを簡単に含める方法はありますか?
助けてくれてありがとう。
キーボードが表示されたときにスクロールするには、Cocoa With Loveの このチュートリアル が好きです。
数字キーパッドを閉じるには、 キーパッドにカスタムの「完了」ボタンを配置 するか、画面の残りの部分に非表示のボタンを作成します。後者はコードで行いましたが、 このチュートリアル はInterface Builderを使用しています。
この問題の簡単なアプリケーションを作成しました。テキストフィールドの位置を自動的にチェックし、キーボードがそれを非表示にした場合、必要に応じて自動的に上に移動します。
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[self animateTextField:textField up:YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self animateTextField:textField up:NO];
}
- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
int animatedDistance;
int moveUpValue = textField.frame.Origin.y+ textField.frame.size.height;
UIInterfaceOrientation orientation =
[[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationPortrait ||
orientation == UIInterfaceOrientationPortraitUpsideDown)
{
animatedDistance = 216-(460-moveUpValue-5);
}
else
{
animatedDistance = 162-(320-moveUpValue-5);
}
if(animatedDistance>0)
{
const int movementDistance = animatedDistance;
const float movementDuration = 0.3f;
int movement = (up ? -movementDistance : movementDistance);
[UIView beginAnimations: nil context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
self.view.frame = CGRectOffset(self.view.frame, 0, movement);
[UIView commitAnimations];
}
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
これは手動で行う必要があります。この回答をご覧ください。 ITextField:キーボードが表示されたらビューを移動
誰かがそれを必要とする場合、私はValayPatelのソリューションをSwiftに翻訳しました
func animatedTextField(textField: UITextField, up: Bool){
var animatedDistance : Int = 0
let moveUpValue : Int = Int(textField.frame.Origin.y) + Int(textField.frame.size.height)
switch UIDevice.currentDevice().orientation {
case .Portrait , .PortraitUpsideDown:
animatedDistance = 216 - (460 - moveUpValue - 5)
default:
animatedDistance = 162 - (320 - moveUpValue - 5)
}
if (animatedDistance > 0 ){
let movementDistance : Int = animatedDistance
let movementDuration : Float = 0.3
let movement = up ? -movementDistance : movementDistance
UIView.beginAnimations(nil, context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(NSTimeInterval(movementDuration))
self.view.frame = CGRectOffset(self.view.frame, 0, CGFloat(movement))
UIView.commitAnimations()
}
}
このコードを使用してください:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHide:)
name:UIKeyboardDidHideNotification
object:self.view.window];
}
- (void)viewDidDisappear:(BOOL)animated {
// unregister for keyboard notifications while not visible.
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardDidHideNotification
object:nil];
}
- (void)keyboardDidHide:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft))
viewFrame.size.height += 140;
else viewFrame.size.height += 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = NO;
}
- (void)keyboardDidShow:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft))
viewFrame.size.height -= 140;
else viewFrame.size.height -= 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = YES; }
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
CGRect viewFrame = scrollView.frame;
if ((interfaceOrientation == UIDeviceOrientationLandscapeRight) || (interfaceOrientation == UIDeviceOrientationLandscapeLeft)) //wants to change to landscape mode
if (keyboardVisible == NO)//currently in portrait,check if keyboard was present
viewFrame.size = CGSizeMake(480,250);
else viewFrame.size = CGSizeMake(480,170);
else {//wants to change to portrait mode
if (keyboardVisible == NO)//currently in landscape,check if keyboard was present
viewFrame.size = CGSizeMake(320,416);
else viewFrame.size = CGSizeMake(320,200);
}
scrollView.frame = viewFrame;
return YES;
}
ランドスケープモードでも機能しますが、iPhoneのみです。 iPadの場合、それに応じてフレーム設定を変更します。 textFieldShouldReturn:
メソッドは、リターンが押されたときにキーボードを非表示にします。お役に立てれば...
以下のコードは私にとって完璧に機能します。
[textFieldFocused becomeFirstResponder];
[self.view addSubview:startView];
[textFieldFocused resignFirstResponder];
このような状況は、iPhoneをひどく傷つけます。キーボードが表示されたときにフィールドが表示されるようにインターフェースを設計するか、キーボードが表示されたときにフィールドを上にシフトする必要があります。 (そしてあなたが終わったら戻ってください)
Apple連絡先や設定などのアプリを見て、これがどのように処理されているかを確認することをお勧めします。
また、iPhone HIGにはそれについて何か言いたいことがあると思います。
私は同様の質問に対する無数の答えを探し続けてきました。基本的な単一画面アプリの場合、このソリューションは魅力のように機能し、実装は非常に簡単です: https://github.com/michaeltyson/TPKeyboardAvoiding
確かにもっと洗練された解決策がありますが、これは仕事を迅速に完了させます。
私はこれに答えるのが少し遅れていることを知っていますが、非常に簡単な解決策を見つけました。 tableViewをオブジェクトとして持つUIViewControllerではなく、UITableViewコントローラーを使用する場合、この問題は発生しません。
テーブルの下部にあるテキストフィールドをクリックすると、キーボードがポップアップし、編集中のテキストフィールドが表示されるまで、テーブルビューが自動的に上にスクロールします。
ただし、キーボードの戻るボタンを使用すると、自動スクロールは機能しません。このシナリオでは、テーブルを手動で上にスクロールして、テキストフィールドを表示します。
これが役に立てば幸い
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[self animateTextField:textField up:YES];
}
このコードをビューのcontroller.mファイルで使用してください。テキストフィールドをクリックするとこのコードが使用され、キーボードが表示されます。ビューをクリックすると、キーボードが非表示になります。これが役立つことを願っています...
UITableViewを編集モードに設定するのは簡単です!
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView setEditing:YES];
}
セルの左側にある削除バブルを非表示にする場合は、UITableViewDelegateメソッドを実装します。
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
NSLog(@"%f",textField.frame.Origin.y);
CGPoint scrollPoint = CGPointMake(0, textField.frame.Origin);
[scrollView setContentOffset:scrollPoint animated:YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[scrollView setContentOffset:CGPointZero animated:YES];
}