1

画面の下部に追加し、ボタンが押された場合に画面の大部分を占めるようにアニメーション化するUIViewに問題があります。ビューは上下にアニメーション化し、意図したとおりに回転します。風景の中でアニメーション化しようとすると、壊れてエラーメッセージが表示されます。

*** Assertion failure in -[UIScrollView _edgeExpressionInContainer:vertical:max:], /SourceCache/UIKit_Sim/UIKit-2380.17/NSLayoutConstraint_UIKitAdditions.m:2174
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Autolayout doesn't support crossing rotational bounds transforms with edge layout constraints, such as right, left, top, bottom. The offending view is: <UIView: 0x9199340; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = RM+BM; layer = <CALayer: 0x91993d0>>'

問題のあるビューはself.viewです。

UIViewの作成方法:

[self.myContentView addSubview:subBar.filterListView];

[self.myContentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[filterListView]|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:@{@"filterListView": subBar.filterListView}]];

subBar.filterListView.bottomConstraint = [NSLayoutConstraint constraintWithItem:subBar.filterListView
                                                                      attribute:NSLayoutAttributeBottom
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:self.mapView
                                                                      attribute:NSLayoutAttributeBottom
                                                                     multiplier:1
                                                                       constant:0];

subBar.filterListView.topConstraint = [NSLayoutConstraint constraintWithItem:subBar.filterListView
                                                                   attribute:NSLayoutAttributeTop
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:self.mapView
                                                                   attribute:NSLayoutAttributeBottom
                                                                  multiplier:1
                                                                    constant:0];

[self.myContentView addConstraint:subBar.filterListView.bottomConstraint];
[self.myContentView addConstraint:subBar.filterListView.topConstraint];

self.myContentViewは、self.view全体を占めるU​​IViewです。

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:NSDictionaryOfVariableBindings(contentView)]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|"
                                                                         options:0
                                                                         metrics:nil
                                                                           views:NSDictionaryOfVariableBindings(contentView)]];    

subBar.filterListViewをアニメーション化するには、上部と下部の制約を削除し、それらを再割り当てして追加し、アニメーション化します。

[self.myContentView removeConstraint:view.topConstraint];
[self.myContentView removeConstraint:view.bottomConstraint];

view.topConstraint = [NSLayoutConstraint constraintWithItem:view
                                                  attribute:NSLayoutAttributeTop
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:self.topToolBar
                                                  attribute:NSLayoutAttributeBottom
                                                 multiplier:1
                                                   constant:0];

view.bottomConstraint.constant -= SUB_BAR_SIZE.height;

[self.myContentView addConstraint:view.topConstraint];
[self.myContentView addConstraint:view.bottomConstraint];

[self.myContentView setNeedsUpdateConstraints];

[UIView animateWithDuration:.25 animations:^{
    [self.myContentView layoutIfNeeded];
}];

コードが回転すると、コードが上下と混同されていませんか?ポートレートトップはランドスケープの左側だと思いますか?

4

3 に答える 3

2

わかりました、私は解決策を見つけました。上記の問題を修正するのではなく、別の方法でアプローチする方法を見つけました。

代わりに、制約をVisual Format Language(VFL)メソッドに変更しました。

subBar.filterListView.verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[filtersSubBar][filterListView(0)]" options:0
                                                                                    metrics:nil
                                                                                      views:@{@"filterListView": subBar.filterListView, @"filtersSubBar" : subBar.filtersSubBar}];

NSLayoutAttributeTop問題の原因となった属性などを使用して問題が発生したと思いますNSLayoutAttributeRight

自動レイアウトは回転を処理できず、新しい方向を表すためにNSLayoutAttributeTop変更する必要があるときに使用しようとしました。NSLayoutAttributeRight制約を手動で変更できると思います。

VFLはそれを別の方法で処理し、属性を使用しないようですか?

これは、iOSのバグまたは単なる欠点のように感じます。

于 2013-02-28T17:55:47.323 に答える
1

グーグルからここに来る人へ:カスタムPushSegueでpresentViewコントローラーを呼び出しているときにこの例外が発生しました:

@implementation PushSegue
- (void) perform
{
    UIViewController* fromController = (UIViewController*) self.sourceViewController;
    UIViewController* toController = (UIViewController*) self.destinationViewController;

    CATransition* transition = [CATransition animation];

    BOOL iPad = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;

    transition.duration = iPad ? 0.5 : 0.3;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush;

    switch ([UIApplication sharedApplication].statusBarOrientation)
    {
        case UIInterfaceOrientationPortraitUpsideDown:
            transition.subtype = kCATransitionFromLeft;
            break;

        case UIInterfaceOrientationLandscapeLeft:
            transition.subtype = kCATransitionFromBottom;
            break;

        case UIInterfaceOrientationLandscapeRight:
            transition.subtype = kCATransitionFromTop;
            break;

        default:
            transition.subtype = kCATransitionFromRight;
            break;
    }

    [fromController.view.window.layer addAnimation:transition forKey:nil];

    [fromController presentViewController:toController animated:NO completion:nil];
}
@end

原因は、いくつかの誤解のために私が私のコードにこれを持っていたということでした:

[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];

(これは私の最初のiOSアプリです)そのような呼び出しを実行するべきではないので、私はそれを削除し、すべてが今動作します

于 2014-01-06T20:39:45.453 に答える
0

そうです、自動レイアウトは、UIオブジェクトの配置長方形に影響を与えるアニメーション変換では機能しません。

于 2013-11-27T12:22:22.323 に答える