web-dev-qa-db-ja.com

pushviewcontrollerアニメーションが遅い/途切れる

ビューをあまり含まないViewControllerをプッシュし、内部に10個のビューを含むUIScrollViewを押します。シングルトンViewControllerを持ち、解放と割り当てをせずに何度も何度もプッシュします。 ViewController、つまりviewDidLoad()viewWillAppear()で実行するすべてのことですが、アニメーションが遅く途切れがちです。

29
user784625

UIViewController AがpushViewControllerをプッシュしてUIViewController Bをプッシュすると、プッシュアニメーションが約25%で停止し、停止してから、Bを最後までスライドさせるという問題がありました。

これはDID iOS 6では発生しませんが、XCode 5のベースSDKとしてiOS 7を使い始めるとすぐに、これが発生し始めました。

修正は、ビューコントローラーBのルートビューにbackgroundColorが設定されていないことです(ルートビューは、通常loadViewで設定するviewController.viewの値です)。そのルートビューの初期化子でbackgroundColorを設定すると、問題が修正されました。

私はこれをなんとかして次のように修正しました:

// CASE 1: The root view for a UIViewController subclass that had a halting animation

- (id)initWithFrame:(CGRect)frame

{

     if ((self = [super initWithFrame:frame])) {

          // Do some initialization ...

          // self.backgroundColor was NOT being set

          // and animation in pushViewController was slow and stopped at 25% and paused

     }

     return self;

}

// CASE 2: HERE IS THE FIX

- (id)initWithFrame:(CGRect)frame

{

     if ((self = [super initWithFrame:frame])) {

          // Do some initialization ...

          // Set self.backgroundColor for the fix!

          // and animation in pushViewController is no longer slow and and no longer stopped at 25% and paused

          self.backgroundColor = [UIColor whiteColor]; // or some other non-clear color

     }

     return self;

}
92
Joel

この問題の唯一の解決策であり、メインビューの背景色をクリアカラーに設定しないでください。

次のビューが前のビューの上に来るとき、背景をクリアカラーに設定すると、透明になるため、前のビューは常に表示され、アニメーションが損なわれることがあります。

29
Indrajeet

まず、[インストゥルメント]> [タイムプロファイラ]を使用して、必要以上に時間がかかっているコードの部分があるかどうかを確認します。

また、インストゥルメント>コアアニメーションツールを使用して、効率的に描画/アニメーション化されない画面の一部にフラグを設定することもできます。

古いiPhoneまたはオリジナルのiPodを使用している場合-画面が複雑で、一部のアプリが少し不安定なことに気付きました。

4
bandejapaisa

これは、以下のリンクされた回答で説明されている既知のバグである可能性があります。私にも同様の問題があり、以下の回答を読んでそれが明確になりました。

今日、同じ問題に遭遇しました。私はトピックを掘り下げました、そしてそれは眠っている主なrunloopに関連しているようです。

this を参照してください。

0

Swift:シャドウをビューなどに適用している場合は、以下のコードを試すこともできます。

view.layer.shouldRasterize = true
view.layer.rasterizationScale = UIScreen.main.scale
0
ZAFAR007

私の場合、viewWillLayoutSubviews()メソッドでUI変更コード(shadow And cornerRadius And ...など)を設定し、それらのコードをviewWillAppear()などの他のメソッドに配置すると、遷移がスムーズになります

0

私はこの問題を抱えていました。それは、プッシュされたビューコントローラーの古いコードが原因で、ビューが「フェードイン」し、viewWillAppearでアルファを0に設定し、viewDidAppearでアルファを1に設定しました。

これを行った古いコードを削除したところ、Pushは正常に機能しました。

-(void)viewWillAppear {
    self.view.alpha = 0; //REMOVE THIS LINE
}
0
Jeffrey Sun

私の問題は、viewWillAppearに大量のロードコードを配置することです。私の場合は

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    tableView.reloadData()
}

そして、私は多くの行を持っているので、pushViewControllerは遅延します。

0
Howard