2012-10-07 10 views
9

UIScrollViewの内部にフォームを実装しています。キーボードを開いたときにスクロールビューのコンテンツの下部にスペースを追加しようとしているので、ユーザーはすべてのフィールドを見ることができます。私は、フォームの高さとscrollviewは自動的にそのコンテンツのサイズを適応させる最初の行に指定し、あなたが見ることができるようにiOS:自動レイアウトを使用してUIScrollviewの内容を変更する

[_infoView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_infoView(1730)]" options:0 metrics:nil views:views]]; 

[_scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_infoView]|" options:0 metrics:nil views:views]]; 

[_scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_infoView]|" options:0 metrics:nil views:views]]; 

[_scrollView addConstraint:[NSLayoutConstraint constraintWithItem:_infoView 
                 attribute:NSLayoutAttributeCenterX 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:_scrollView 
                 attribute:NSLayoutAttributeCenterX 
                 multiplier:1 
                 constant:0]]; 

:私は、次のコードですべての必要な制約を加えることUISCrollView内のフォームビューを置きます。今ではフォームの高さを上げたいので、高さの制約をより大きなものにリセットしようとしましたが、うまくいかないでしょう。次に、[_scrollView setContentSize:]メソッドを使用しようとしましたが、これも機能しません。誰も私を助けることができますか?

+0

あなたはこれを理解しましたか?私はこれを考え出してひどい時を過ごしています。 – mkral

答えて

-2

私はあなたが上記のコードを追加する場所を確認していないが、以下の以下を追加し、あなたのinit関数では、あなたの問題

を解決する必要があります。

NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
     [center addObserver:self selector:@selector(noticeShowKeyboard:) name:UIKeyboardDidShowNotification object:nil]; 
     [center addObserver:self selector:@selector(noticeHideKeyboard:) name:UIKeyboardWillHideNotification object:nil]; 

あなたの.h

に以下を追加します。
CGSize keyboardSize; 
int keyboardHidden;  // 0 @ initialization, 1 if shown, 2 if hidden 

はあなた.Mに以下を追加します

-(void) noticeShowKeyboard:(NSNotification *)inNotification { 
    keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    keyboardHidden = 1; 
    [self layoutSubviews];  // Not sure if it is called automatically, so I called it 


} 
-(void) noticeHideKeyboard:(NSNotification *)inNotification { 
    keyboardHidden = 2; 
    [self layoutSubviews];  // Not sure if it is called automatically, so I called it 

} 

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    if(keyboardHidden == 1) { 
     scrollview.frame = CGRectMake(scrollview.frame.origin.x, scrollview.frame.origin.y, scrollview.frame.size.width, scrollview.frame.size.height + keyboardSize.height); 
    } 
    else if(keyboardHidden == 2) { 
     scrollview.frame = CGRectMake(scrollview.frame.origin.x, scrollview.frame.origin.y, scrollview.frame.size.width, scrollview.frame.size.height - keyboardSize.height); 
    } 
} 

layoutsubviewsを上書きしました。今はうまくいくはずです。

+0

あなたのペン先が自動レイアウトを使用している場合、rectサイズは制約によって管理され、diretclyは動作しません。 – mastergap

+1

編集した回答を確認して、 'layoutsubviews'を無効にすると問題は解決します。 – MuhammadBassio

4

私が問題を理解している場合はlayoutSubviewsというよりUIScrollViewcontentInsetプロパティを調整することをおすすめします。ドキュメントの内容は次のとおりです。

コンテンツのスクロール領域に追加するには、このプロパティを使用します。サイズの単位はポイントです。デフォルト値はUIEdgeInsetsZeroです。

あなたはまだあなたのscrollviewの高さを調整する際に知っているように、キーボードの表示/非表示の通知をリッスンする必要があります。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 

次にkeyboardWillShowにあなたがこれを行うことができます:

UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, 100, 0); 
scrollView.contentInset = insets; 

100は、scrollViewを調整する高さです。私はUITableViewでこれを行います。ここにはUITableViewCellという形式要素があり、うまくいきます。

関連する問題