1

3 つのビュー階層 (ポップオーバー、ページ コンテナー、ページビュー) があり、ページビューはページ コンテナー内に配置され、ページ コンテナーはポップオーバー内に配置されます。それらはすべて UIView クラスです。

ページコンテナにスワイプジェスチャを追加しました。スワイプが発生すると、ページ ビューが別のページ ビューに置き換えられます。スワイプした直後にアニメーションを取得しようとしています。左にスワイプすると現在の状態から始まりますが、右にスワイプすると混乱し、すべてのスワイプの後も混乱したままになります。何らかの理由でアニメーションに一貫性がありません。

以下はコードで、アニメーションブロック内に制約を入れてみましたが、違いはありません。

- (IBAction)swipeLeft:(id)sender {

    if (_currentPage < [_pages count] - 1) {
        UIView *currentView = _pages[_currentPage];
        UIView *pageContainer = [currentView superview];

        [currentView removeFromSuperview];
        ++_currentPage;
        if (_pageControl)
            _pageControl.currentPage = _currentPage;
        UIView *newPage = _pages[_currentPage];


        [pageContainer addSubview:newPage];


        newPage.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
        newPage.frame = CGRectIntegral(newPage.frame);

        [pageContainer.superview layoutIfNeeded];

        NSDictionary *pageviews = NSDictionaryOfVariableBindings(newPage);

        if (SYSTEM_VERSION_LESS_THAN(@"7.0"))
            [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10.0-[newPage]-10.0-|" options:0 metrics:nil views:pageviews]];

        else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
            [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0.0-[newPage]-0.0-|" options:0 metrics:nil views:pageviews]];


        [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0.0-[newPage]-0.0-|" options:0 metrics:nil views:pageviews]];

        CGSize pageContainerSize = [pageContainer systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
        pageContainer.frame = CGRectMake(pageContainer.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height);


        [UIView animateWithDuration:5.0
                              delay:0.0
                            options: UIViewAnimationOptionBeginFromCurrentState
                         animations:^{
                             [pageContainer.superview layoutIfNeeded];

                         }
                         completion:^(BOOL finished){
                         }];

        UIWindow *window = [[UIApplication sharedApplication].windows objectAtIndex:0];

        [self adjustPopoverOrientationWithCurrentOrientation:window];


    }
}

と...

- (IBAction)swipeRight:(id)sender  {
    if (_currentPage > 0) {
        UIView *currentView = _pages[_currentPage];
        UIView *pageContainer = [currentView superview];

        [currentView removeFromSuperview];
        --_currentPage;
        if (_pageControl)
            _pageControl.currentPage = _currentPage;
        UIView *newPage = _pages[_currentPage];

        [pageContainer addSubview:newPage];

        newPage.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
        newPage.frame = CGRectIntegral(newPage.frame);

        [pageContainer.superview layoutIfNeeded];

        NSDictionary *pageviews = NSDictionaryOfVariableBindings(newPage);

        if (SYSTEM_VERSION_LESS_THAN(@"7.0"))
            [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10.0-[newPage]-10.0-|" options:0 metrics:nil views:pageviews]];

        else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
            [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0.0-[newPage]-0.0-|" options:0 metrics:nil views:pageviews]];

        [pageContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0.0-[newPage]-0.0-|" options:0 metrics:nil views:pageviews]];

        CGSize pageContainerSize = [pageContainer systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

        pageContainer.frame = CGRectMake(pageContainer.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height);



        [UIView animateWithDuration:5.0
                              delay:0.0
                            options: UIViewAnimationOptionBeginFromCurrentState
                         animations:^{
                             [pageContainer.superview layoutIfNeeded];

                         }
                         completion:^(BOOL finished){
                         }];


        UIWindow *window = [[UIApplication sharedApplication].windows objectAtIndex:0];


        [self adjustPopoverOrientationWithCurrentOrientation:window];


    }
}
4

1 に答える 1

14

Auto Layout の第一のルールは、フレームに触れてはいけないということです。

自動レイアウト階層にあるビューのフレーム、境界、または中心を変更することはできません。

あなたのコードを読むのは少し混乱するので、あなたが実際に何をアニメーション化しているのか 100% 確信が持てません. しかし、あなたがする必要があるのは、次のようなすべての行を削除することです...

pageContainer.frame = CGRectMake(pageContainer.frame.origin.x, pageContainer.frame.origin.y, pageContainerSize.width, pageContainerSize.height);

画面上で何かを移動したい場合は、新しい制約が新しいレイアウトを意味するように、制約を更新する必要があります。

たとえば、ビューの高さをアニメーション化する必要がある場合は...

自動レイアウト制約への参照を保持...

@property (nonatomic, strong) NSLayoutConstraint *heightConstraint;

また...

// if you're creating the constraint in Interface Builder then CTRL drag it like any other outlet.
@property (nonatomic, weak) IBOutlet NSLayoutConstraint *heightConstraint;

次にconstant、制約のプロパティを変更します。

// animate the height to 150.
heightConstraint.constant = 150;

レイアウトの変更をアニメーション化します...

[UIView animateWithDuration:5.0
                      delay:0.0
                    options: UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     [pageContainer.superview layoutIfNeeded];
                 }
                 completion:^(BOOL finished){
                 }];

どのコンストレインを変更する必要があるかがわかったら、コンストレインをアニメートできるようにする最善の方法を考え出すことができます。

編集

また、自動サイズ変更マスクの変換をオフにしていることを確認する必要があります...

[someView setTranslatesAutoresizingMaskIntoConstraints:NO];

ただし、コードをより読みやすくすることに取り組みます。コードの複製などを減らすために、おそらく別の機能に移動する可能性があります...

現時点で読むのは混乱しています。

于 2013-08-21T17:03:45.183 に答える