web-dev-qa-db-ja.com

Xcodeの警告:「これにより、不透明度が1に戻るまで効果が壊れたように見えます」

プロトタイプセルがあり、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.

この警告が表示される理由と、このアルファプロパティを適切に設定する方法を理解できませんでした。

29
aslisabanci

私が覚えている限りでは、視覚効果ビューのアルファを変更することはできません。アルファは常に1でなければなりません。

12
user1179321

問題は、何をアニメーション化するかです。効果の場合、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自体のアルファを変更することは絶対にしないでください。

14
zvonicek

視覚効果ビューではなく、背景色のアルファを設定することで、目的の効果を実現できます。サブビューは、視覚効果ビューのビューに追加する必要があり、バックグラウンドブラーの影響を受けません。

Vibrancyエフェクトは、上記のビューエフェクトビューオプションで選択する必要があります。

画像をご覧ください:

enter image description here

8
Sahil Kapoor

user1179321は明確に正しい。 UIVisualEffectViewドキュメントによると、

UIVisualEffectViewクラスを使用するときは、1未満のアルファ値を避けてください。部分的に透明なビューを作成すると、オフスクリーンレンダーパス中にシステムがビューと関連するすべてのサブビューを結合します。 UIVisualEffectViewオブジェクトは、正しく見えるように、それらが上に重ねられているコンテンツの一部として結合する必要があります。視覚効果ビューまたはそのスーパービューでアルファを1未満に設定すると、多くの効果が正しく表示されないか、まったく表示されなくなります。

https://developer.Apple.com/library/ios/documentation/uikit/reference/UIVisualEffectView/index.html

5

私の解決策:

  1. 視覚効果ビューの背後にあるレイヤーを複製します。 (私の場合、UIImageView)
  2. 複製されたビューのアルファ値をアニメーション化します。 (例:アルファ形式1から0、ぼやけた画像を表示)
1
Bill Chan

遅延が十分に長いかどうかはわかりません。そのため、次の実行ループでプレゼンテーションを行うだけで、よりクリーンなソリューションが得られます。

 dispatch_async(dispatch_get_main_queue(), ^(void){
    [self presentViewController:yourPopoverr animated: YES completion: nil];
  });
0
Phantom59

ビューコントローラーをモーダルモードで表示する場合は、セグエのアニメーションチェックボックスを無効にしてみてください。

0
vanab