質問: true; } ちなみに、私は何度もチェックしてきましたが、これはmainスレッドで実行されています。
回答: ストーリーボード、コード、ヒント、そしていくつかのgotcha他の答えは大丈夫ですが、これは最近の例を使用して制約をアニメートすることのいくつかのかなり重要な落とし穴を強調しています。次のことに気付く前に、さまざまなバリエーションを経験しました。強力な参照を保持するために、ターゲットとする制約をクラス変数にします。 swiftでは、遅延変数を使用しました。lazy var centeryinflection:nslayoutconstraint = { let temp = self.view.constraints.filter({ $0.firstitem is mngstarrating }).filter ( { $0.seconditem is uiwebview }).filter({ $0.firstattribute == .centery }).first return temp! }() いくつかの実験の後、私はビューは(別名スーパービュー)から制約が定義されている2つのビューから制約を取得しなければなりません。私はその間に制約を作成しています、そしてそれらはself.view内のサブビューです。フィルタチェーン私はswiftのフィルター法を利用して、変曲点として機能する目的の制約を分離します。もっと複雑になるかもしれませんが、filterはここではいい仕事をします。swiftを使用した制約のアニメーション化 nota bene - この例はストーリーボード/コードソリューションであり、ストーリーボードでデフォルトの制約が設定されていると仮定しています。コードを使用して変更をアニメートすることができます。 正確な基準でフィルタリングし、アニメーションの特定の変曲点に到達するプロパティを作成するとします(もちろん、配列をフィルタリングして複数の制約が必要な場合はループスルーすることもできます)。lazy var centeryinflection:nslayoutconstraint = { let temp = self.view.constraints.filter({ $0.firstitem is mngstarrating }).filter ( { $0.seconditem is uiwebview }).filter({ $0.firstattribute == .centery }).first return temp! }() .......今度いつか...@ibaction func toggleratingview (sender:anyobject){ let apointabovescene = -(max(uiscreen.mainscreen().bounds.width,uiscreen.mainscreen().bounds.height) * 2.0) self.view.layoutifneeded() //use any animation you want, i like the bounce in springvelocity... uiview.animatewithduration(1.0, delay: 0.0, usingspringwithdamping: 0.3, initialspringvelocity: 0.75, options: [.curveeaseout], animations: { () -> void in //i use the frames to determine if the view is on-screen if cgrectcontainsrect(self.view.frame, self.ratingview.frame) { //in frame ~ animate away //i play a sound to give the animation some life self.centeryinflection.constant = apointabovescene self.centeryinflection.priority = uilayoutpriority(950) } else { //i play a different sound just to keep the user engaged //out of frame ~ animate into scene self.centeryinflection.constant = 0 self.centeryinflection.priority = uilayoutpriority(950) self.view.setneedslayout() self.view.layoutifneeded() }) { (success) -> void in //do something else } } } 多くの間違ったターンこれらのメモは本当に私が自分自身のために書いたヒントのセットです。私は個人的にそして痛々しいことにすべての禁止事項をやりました。うまくいけば、このガイドは他の人を倹約することができます。 zpositioningに気をつけてください。何も起きていないように見える場合は、他のビューを非表示にするか、ビューデバッガを使用してアニメーションビューを見つける必要があります。ストーリーボードのxmlでユーザー定義のランタイム属性が失われ、(動作中に)アニメーションビューが隠されることになったことさえあります。 ドキュメント(新旧)、クイックヘルプ、およびヘッダーを読むには、少々時間がかかります。 appleはautolayout制約をよりよく管理するために多くの変更を続けています(スタックビューを参照)。または少なくとも autolayout cookbook 。時には最善の解決策が古いドキュメント/ビデオにあることを覚えておいてください。 アニメーションの値をいろいろ試して、他のanimatewithdurationバリアントの使用を検討してください。 特定のレイアウト値を他の定数への変更を判断するための基準としてハードコードしないでください。代わりに、ビューの場所を判断できる値を使用してください。 cgrectcontainsrectはその一例です 必要に応じて、制約定義let viewmargins = self.webview.layoutmarginsguideに参加しているビューに関連付けられているレイアウト余白を使用することを躊躇しないでください。 あなたがする必要のない仕事をしないでください、ストーリーボード上の制約を持つすべてのビューは、プロパティself.viewname.constraintsに結び付けられた制約を持っています 制約条件の優先順位を1000未満に変更します。ストーリーボードで、私の設定を250(最低)または750(最高)にします。 (あなたがコード内の何かに1000の優先順位を変更しようとすると、1000が必要であるため、アプリはクラッシュします) activateconstraintsとdeactivateconstraintsをすぐに使用しようとしないことを検討してください(それらはそれらの場所を持っていますが、これらを使用してストーリーボードを使用しているかのような場合 実際にコードに新しい制約を追加しない限り、addconstraints/removeconstraintsを使用しないでください。ほとんどの場合、ストーリーボード内のビューを目的の制約でレイアウトし(ビューを画面外に配置し)、コード内で、ストーリーボードで以前に作成した制約をアニメートしてビューを移動します。 新しいnsanchorlayoutクラスとサブクラスを使用して制約を構築するために多くの時間を費やしました。これらはうまく機能しますが、私が必要とするすべての制約がストーリーボードにすでに存在していることに気付くまでに時間がかかりました。コードで制約を構築する場合は、最も確実にこのメソッドを使用して制約を集約してください。 ストーリーボード使用時のavoidに対する解決策のクイックサンプルprivate var _nc:[nslayoutconstraint] = [] lazy var newconstraints:[nslayoutconstraint] = { if !(self._nc.isempty) { return self._nc } let viewmargins = self.webview.layoutmarginsguide let minimumscreenwidth = min(uiscreen.mainscreen().bounds.width,uiscreen.mainscreen().bounds.height) let centery = self.ratingview.centeryanchor.constraintequaltoanchor(self.webview.centeryanchor) centery.constant = -1000.0 centery.priority = (950) let centerx = self.ratingview.centerxanchor.constraintequaltoanchor(self.webview.centerxanchor) centerx.priority = (950) if let buttonconstraints = self.originalratingviewconstraints?.filter({ ($0.firstitem is uibutton || $0.seconditem is uibutton ) }) { self._nc.appendcontentsof(buttonconstraints) } self._nc.append( centery) self._nc.append( centerx) self._nc.append (self.ratingview.leadinganchor.constraintequaltoanchor(viewmargins.leadinganchor, constant: 10.0)) self._nc.append (self.ratingview.trailinganchor.constraintequaltoanchor(viewmargins.trailinganchor, constant: 10.0)) self._nc.append (self.ratingview.widthanchor.constraintequaltoconstant((minimumscreenwidth - 20.0))) self._nc.append (self.ratingview.heightanchor.constraintequaltoconstant(200.0)) return self._nc }() これらのヒントの1つを忘れた場合、またはlayoutifneededを追加する場所などのより単純なヒントを忘れた場合は、ほとんど何も起こらないでしょう。この場合、次のようなハーフベイクの解決策があります。 注意 - 下のオートレイアウトセクションとオリジナルのガイドを読んでください。あなたのダイナミックアニメーターを補うためにこれらのテクニックを使う方法があります。 uiview.animatewithduration(1.0, delay: 0.0, usingspringwithdamping: 0.3, initialspringvelocity: 1.0, options: [.curveeaseout], animations: { () -> void in // if self.startopinflectionpoint.constant < 0 { //-3000 //offscreen self.startopinflectionpoint.constant = self.navigationcontroller?.navigationbar.bounds.height ?? 0 self.changeconstraintpriority([self.startopinflectionpoint], value: uilayoutpriority(950), forview: self.ratingview) } else { self.startopinflectionpoint.constant = -3000 self.changeconstraintpriority([self.startopinflectionpoint], value: uilayoutpriority(950), forview: self.ratingview) } }) { (success) -> void in //do something else } } オートレイアウトガイドのスニペット(2番目のスニペットはos xを使用するためのものです)。 btw - これは私が見ることができる限り現在のガイドにはもうありません。好ましいテクニックは進化し続けています。自動レイアウトによる変更のアニメーション化自動レイアウトによる変更のアニメーション化を完全に制御する必要がある場合は、プログラムで制約を変更する必要があります。基本的な概念はiosとos xの両方で同じですが、いくつかの小さな違いがあります。iosアプリでは、コードは次のようになります。[containerview layoutifneeded]; // ensures that all pending layout operations have been completed [uiview animatewithduration:1.0 animations:^{ // make all constraint changes here [containerview layoutifneeded]; // forces the layout of the subtree animation block and then captures all of the frame changes }]; os xでは、レイヤー付きアニメーションを使用するときは次のコードを使用します。[containterview layoutsubtreeifneeded]; [nsanimationcontext runanimationgroup:^(nsanimationcontext *context) { [context setallowsimplicitanimation: yes]; // make all constraint changes here [containerview layoutsubtreeifneeded]; }]; レイヤバックアニメーションを使用していない場合は、コンストレインのアニメーターを使用して定数をアニメートする必要があります。[[constraint animator] setconstant:42]; 視覚的によく学ぶ人のために、この初期の{ appleからのビデオ をチェックしてください。注意を払うドキュメンテーションの中には、より大きなアイデアにつながる小さなメモやコードの断片があることがよくあります。たとえば、動的なアニメーターに自動レイアウト制約を付けることは大きなアイデアです。幸運を祈り、力があなたと共にあるように。