0

下の画像から、ユーザーがview1をタップすると、view2とview3がフッターにスライドダウンし、フッターでview3の制約定数を0(っぽい)に設定することで効果的に引っ張られます。最初の画像に示すように、制約を使用して xib をセットアップしました。[今の私にとって] 最も重要な 2 つは、view1View2 制約と view3Footer 制約です。

制約とビューを持つ xib

スライド ダウンを実現するために、view1view2 制約の優先度を低く設定し、view3Footer 制約の優先度を高く設定してから、animateWithDuration で view3Footer 制約定数を更新しました。

スライドダウン成功

私の問題は、view2 と view3 を上にスライドさせることです。これは、同じ方法を使用していた場合、view1view2 制約定数を 2 に設定することで達成できます。

上記のスライドアップの問題は、view1View2 制約よりも view3Footer 制約の優先度が高いことだと思います。優先度は読み取り専用のように見えるため、これらを具体的に変更することはできません。制約の設定では、ビューの配置のみを要求していることを理解しています。

...完全に間違った方法を使用している可能性があると思います...

私はこれを正しい方法で行っていますか?制約オブジェクト IBOutlet を取得して書き直す必要がありますか? もしそうなら、私は優先順位を書き直していますか?優先度が等しい定数に >= を使用する必要がありますが、機能していないようです。単純にアニメーション化するための私のコードは以下のとおりです。これは大したことではありませんが、ジェスチャ認識機能を除けば、セットアップは主に xib にあります。

どんな助けでも大歓迎です。ありがとう、スティーブ

スライドダウンの場合:

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

UPDATEまた、この設定の優先順位が等しくなるようにしました-スライドダウンを達成できなくなりました

_view3FooterConstraint.constant=2;
[self.view setNeedsUpdateConstraints];
[UIView animateWithDuration:0.9 animations:^{                            
                        [self.view layoutIfNeeded];
                        } completion:^(BOOL finished){}];

スライドアップの場合:

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

1 に答える 1

1

変更する 2 つの制約 (2 の上部の制約を 1 に、3 の下部の制約をフッターに) 追加および削除するだけでこれを行うことができると思います。すべてのビューに明示的な高さがあることを確認し、IBOutlets を上記の 2 つの制約に合わせます。実際には一度に 1 つしか必要ありませんが、IB に両方を追加して、アウトレットを作成できるようにする必要があります。viewDidLoad では、一番下のものをすぐに削除します。これは、縦向きと横向きで機能するはずです。私が使用したコードは次のとおりです。

implementation ViewController {
   IBOutlet NSLayoutConstraint *conBottom;
   IBOutlet NSLayoutConstraint *conTop;
    int pos;
}

-(void)viewDidLoad{
    [super viewDidLoad];
    pos = 0;
    [self.view removeConstraint:conBottom];
    [self.view layoutSubviews];
}


-(IBAction)togglePosition:(id)sender { //tap recognizer on view one action method
    if (pos == 0) {
        [self moveDown];
    }else{
        [self moveUp];
    }
}

-(void)moveDown {
    [self.view removeConstraint:conTop];
    [self.view addConstraint:conBottom];
    conBottom.constant=2;
    [UIView animateWithDuration:0.9 animations:^{
        [self.view layoutIfNeeded];
    } completion:^(BOOL finished) {
        pos = 1;
    }];
}

-(void)moveUp {
    [self.view removeConstraint:conBottom];
    [self.view addConstraint:conTop];
    conTop.constant=2;
    [UIView animateWithDuration:0.9 animations:^{
        [self.view layoutIfNeeded];
    }completion:^(BOOL finished) {
        pos = 0;
    }];
}
于 2013-02-06T07:24:26.920 に答える