9

内にフォームを実装していUIScrollViewます。キーボードを開いたときにスクロールビューのコンテンツの下部にスペースを追加して、ユーザーがすべてのフィールドを表示できるようにしようとしています。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]];

ご覧のとおり、最初の行でフォームの高さを指定し、scrollviewそのコンテンツサイズを自動的に調整します。フォームの高さを増やしたいので、高さの制約を大きい方にリセットしようとしましたが、機能しません。次に、このメソッドを使用しようとしました[_scrollView setContentSize:]が、これも機能しません。誰か助けてくれませんか?

4

2 に答える 2

4

問題を理解している場合は、を呼び出すのではなく、contentInsetプロパティを調整することをお勧めします。ドキュメントには次のように書かれていることに注意してください。UIScrollViewlayoutSubviews

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

スクロールビューの高さをいつ調整するかを知るために、キーボードの非表示/表示の通知をリッスンする必要があります。

[[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。私はこれをsUITableViewとしてフォーム要素を持っているaでUITableViewCell行い、それはうまく機能します。

于 2013-04-14T19:27:20.180 に答える
-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しましたが、動作するはずです。

于 2012-11-05T11:36:46.737 に答える