1

ビュー (messageView) をメニュー項目 (messageViewMenu) に追加しようとしているので、メニュー項目がタップされたときに、この新しいビューがそのすぐ上に追加され、両方が画面を一緒に下にスライドします - Evernote 5.1 .2 にも似たようなものがあります。

NSLayoutConstraint を使用して、新しいビューをメニュー項目の上部にあると想定するものにアタッチしています。次に、メニュー項目の既存の垂直方向の制約をヘッダー UIView (_headerMessageConstraint) にアニメーション化して、サイズ 300 に拡大します。新しいビューは、メニュー項目の前縁に後縁で垂直に取り付けられ、画面を下にスライドすることを期待します。一緒。

ただし、新しいビューはメニュー項目と共に下にスライドし、上端が揃ったように見えるまでその後ろに続きます。

誰が私が間違っているのか教えてもらえますか? よろしくお願いいたします。

スティーブ

編集。これを投稿してから、新しいビュー (MessageViewController の mvc.view) を追加すると、デフォルトで 0,0 に配置されることがわかりました。ただし、0,0にしたくないので、表示したい場所にフレームを設定する必要があるようです-自動レイアウトを使用すると間違っているようです-または、この新しいビューをサブビューに追加しますおそらく、サブビューの高さをアニメーション化します...ここで暗い場所に自分自身を話しているかもしれませんが.

MessageViewController *mvc = [[MessageViewController alloc] init];
[mvc.view setTranslatesAutoresizingMaskIntoConstraints:NO];
UIView *messageView = mvc.view;
[self.view addSubview:messageView];

UIView *messageViewMenu = self.messageViewMenu;

NSDictionary* views = NSDictionaryOfVariableBindings(messageViewMenu, messageView);

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[messageView]|"
                                                                    options:0
                                                                    metrics:nil
                                                                    views:views]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[messageView(200)]-[messageViewMenu]"
                                                                    options:0
                                                                    metrics:nil
                                                                    views:views]];
[self.view layoutSubviews]; // UPDATE - THIS IS THE CODE THAT WAS MISSING - IT DISPLAYS THE SUBVIEWS BEFORE THE ANIMATION STARTS. THANKS @RDELMAR 

[UIView animateWithDuration:0.9 animations:^{
                        _headerMessageConstraint.constant = 200;
                        [self.view layoutIfNeeded];
                        } completion:^(BOOL finished){}];
4

1 に答える 1

3

何をしようとしているのか正確にはわかりませんが、アニメーション ブロックのすぐ上に [self.view layoutSubviews] という行を追加する必要があります。メイン ビューは、アニメーション化する前に、新しいビューを開始位置にレイアウトする必要があります。

また、スペースなしで 2 つのビューを重ねる場合は、「V:[messageView(200)]-[messageViewMenu]」のダッシュを削除する必要があります。

于 2013-02-04T15:49:25.240 に答える