2017-08-25 7 views
5

を引き起こし埋める:iOSの11 UIStackView比例配分は、私が設定した場合は奇妙なビューローディングアニメーション

stackView.distributon = .fillProportionally 

を次にiOSの11に、このスタックビュー(すべてのサブビューを含むビューをロードするときに、私は非常に奇妙なアニメーションを取得する - だけでなく、スタックビュー - 画面の上部または下部から飛んでいます)。下位バージョンのiOSでは、すべて正常に動作します。スタックビューのディストリビューションを他のものに設定しても、すべて正常に動作します。

この問題の原因は何ですか?

ありがとうございます。

+1

解決方法を見つけましたか?私はスタックビューが 'Fill'ディストリビューション(デフォルト)に設定されていますが、画面の上部から飛んでいるビューにも同様の問題があります。 Xcode 9 GMシードとiOS 11 GMシードの使用 –

+1

'stackView.distributon = .fillProportionally'を設定する直前に' self.view.layoutIfNeeded() 'を呼び出しました。 – kiwisip

+0

@MattCline私は同じ問題を抱えています... :(。どのようなアイデアを修正するには? – kmithi

答えて

8

animationsブロックにという修正を見つけたと思います。

import UIKit 

class ViewController: UIViewController { 

    var showB = true 

    weak var viewB: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let viewA = UIView() 
     viewA.backgroundColor = UIColor.green 

     let toggleViewBButtonAnimated = UIButton(frame: CGRect(x: 50, y: 150, width: 200, height: 40)) 
     toggleViewBButtonAnimated.backgroundColor = UIColor.cyan 
     toggleViewBButtonAnimated.setTitle("Toggle B (animated)", for: .normal) 
     viewA.addSubview(toggleViewBButtonAnimated) 
     toggleViewBButtonAnimated.addTarget(self, action: #selector(toggleBButtonTappedAnimated), for: .touchUpInside) 


     let viewB = UIView() 
     viewB.backgroundColor = UIColor.orange 
     let viewBHeightConstraint = viewB.heightAnchor.constraint(equalToConstant: 200) 
     viewBHeightConstraint.priority = 999 
     viewBHeightConstraint.isActive = true 
     self.viewB = viewB 


     let stackView = UIStackView(arrangedSubviews: [viewA, viewB]) 
     stackView.axis = .vertical 
     stackView.alignment = .fill 
     stackView.distribution = .fill 
     stackView.translatesAutoresizingMaskIntoConstraints = false 

     self.view.addSubview(stackView) 

     stackView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 
     stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 
     stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true 
     stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true 
    } 

    @IBAction func toggleBButtonTappedAnimated() { 
     self.showB = !self.showB 
     UIView.animate(withDuration: 0.3, 
         animations: { self.viewB.isHidden = !self.showB; self.view.layoutIfNeeded() } 
     ) 
    } 
} 

このコントローラは、設定2つの垂直のビュー、緑1(A)とオレンジ1(B)はUIStackView

は、ここに私の再現です。私はないanimationsブロック内self.view.layoutIfNeeded()を持っている場合、ボタンの皮をタップ/隠蔽を解除するにはB.

を表示するビューBが表示されている場合、その後、それは画面の上部から飛びます。 (ビューBが非表示になっていると、画面の下から下に移動して普通に非表示になります)

animationsブロックにself.view.layoutIfNeeded()を追加すると、ビューBが期待通りに表示されます。 。

@ g3rv4からのこのおかげで、私に指摘してくれたおかげで!

+0

素晴らしい! 'stackView.distributon = .fillProportionally'を設定する直前に' self.view.layoutIfNeeded() 'を呼び出す!ありがとう。 – kiwisip

+0

アニメーションブロックの 'UIStackView'の' subview'のhiddenプロパティを変更するべきではありません。なぜならiOS <= 10にバグがあり、iOS 11ではアニメーションが奇妙に見えるからです。 –

+0

アニメーションブロックの最後にself.view.layoutIfNeeded()を追加すると、私のために修正されました。スタックビューは、以前は画面の上部からアニメートされていましたが、適切なポイントからアニメーション化されませんでした。ありがとう! – vikzilla

1

今朝GMシードを使用して同じ問題が発生しました。私は、UIStackViewの変更を行うためにUIView.performWithoutAnimation {ブロックを使用して終了しました。ここでは、アニメーションが当面必要ではありません。

0

私の問題は、iOS 11で導入された動作回帰であり、UIStackView配布タイプとは関係がありませんでした。私はコードベースのソリューションをいくつか試してみました。まず、コンテナ階層でlayoutIfNeededを呼び出します。第2に、(同様の質問に対する別の答えに見られるように)ビューのcontentModeを微調整します。

マイハックソリューションは、以下である:

を表示するアニメーションが誤って画面の端からの項目をもたらしたUIStackViewの側に新たな、ゼロ幅のUIViewプレースホルダを追加します。

関連する問題