プロトタイプセルがあり、UIVisualEffectView
の内部にContentView
を配置します。視覚効果ビューのぼかしスタイルは暗く、鮮やかさはオフです。次に、IBを使用して視覚効果ビューのアルファを0,5に設定します。
その後、実行時に、次のような警告が表示されます。
<UIVisualEffectView ...> is being asked to animate its opacity. This will cause the effect to appear broken until opacity returns to 1.
この警告が表示される理由と、このアルファプロパティを適切に設定する方法を理解できませんでした。
私が覚えている限りでは、視覚効果ビューのアルファを変更することはできません。アルファは常に1でなければなりません。
問題は、何をアニメーション化するかです。効果の場合、alpha
プロパティを使用してアニメーション化することはできません。ただし、iOS 9以降では、アニメーションブロックでエフェクトを設定してアニメーション化できます。
UIVisualEffectView* view = [[UIVisualEffectView alloc] initWithFrame:self.view.bounds];
view.effect = nil;
[UIView animateWithDuration:0.3 animations:^{
view.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
}];
または、他の回答で提案されているように、ラッパービューのアルファをアニメーション化することで効果をアニメーション化できます(iOS 8でも動作します)。
視覚効果ビュー(サブビュー)のコンテンツをアニメーション化する場合は、代わりにcontentView
プロパティをアニメーション化します(これを使用して、効果ビューのサブビューを追加する必要があります)。
[UIView animateWithDuration:0.3 animations:^{
view.contentView.alpha = 1.0;
}];
要約すると、UIVisualEffectView自体のアルファを変更することは絶対にしないでください。
視覚効果ビューではなく、背景色のアルファを設定することで、目的の効果を実現できます。サブビューは、視覚効果ビューのビューに追加する必要があり、バックグラウンドブラーの影響を受けません。
Vibrancyエフェクトは、上記のビューエフェクトビューオプションで選択する必要があります。
画像をご覧ください:
user1179321は明確に正しい。 UIVisualEffectViewドキュメントによると、
UIVisualEffectViewクラスを使用するときは、1未満のアルファ値を避けてください。部分的に透明なビューを作成すると、オフスクリーンレンダーパス中にシステムがビューと関連するすべてのサブビューを結合します。 UIVisualEffectViewオブジェクトは、正しく見えるように、それらが上に重ねられているコンテンツの一部として結合する必要があります。視覚効果ビューまたはそのスーパービューでアルファを1未満に設定すると、多くの効果が正しく表示されないか、まったく表示されなくなります。
https://developer.Apple.com/library/ios/documentation/uikit/reference/UIVisualEffectView/index.html
私の解決策:
遅延が十分に長いかどうかはわかりません。そのため、次の実行ループでプレゼンテーションを行うだけで、よりクリーンなソリューションが得られます。
dispatch_async(dispatch_get_main_queue(), ^(void){
[self presentViewController:yourPopoverr animated: YES completion: nil];
});
ビューコントローラーをモーダルモードで表示する場合は、セグエのアニメーションチェックボックスを無効にしてみてください。