透明な背景色を持つモーダル表示をしたいので、その背後のビューをユーザーが見ることができます。Objective-Cでモーダル背景色を透明に変更するには
答えて
iOSでは、モーダルビューを表示する際に透過性はサポートされません。
はい、私はそう思います。これまで、iOSはモーダルで透明性をサポートしていません。あなたの答えmachunterに感謝します。 :) – Rizki
よく、助けにならないと知っていますが、 –
これは間違っていますが、私はそれをtransperancyで行います。 – DeyaEldeen
おそらく、現在のビューにオーバーレイとしてUIViewを追加したいが、透明または半透明の背景でフルスクリーンにすることが望ましいでしょう。この質問への最初の答えを参照してください:
あなたはソートの、後方に作業する必要があります。 モーダルビューを読み込んで、その上にすべての要素を「手動で」Subviewとして追加します。この方法では隠れていません。 はい、それは多くのコーディングですが、行うことができます。 私はムービーを再生し、ムービープレーヤーのフレームサイズを小さくし、サブビューとしていくつかのボタンとテキストビューを投げて、余分な要素を画面に表示させました。 B
さて、presentModalViewControllerはこの動作を提供していませんが、それでも可能です。私は私のために働くカテゴリーを作りました(うまくいけばあなた)。追加ボーナスとして、同時にモーダルビューを解除して表示することに関連するクラッシュを防止します。
ヘッダファイル:
//
// UIViewController+overView.h
// Created by Kevin Lohman on 5/30/12.
//
#import <UIKit/UIKit.h>
@interface UIViewController (OverView)
- (void)presentOverViewController:(UIViewController *)modalViewController animated:(BOOL)animated;
- (void)dismissOverViewControllerAnimated:(BOOL)animated;
@end
実装ファイル:
//
// UIViewController+overView.m
// Created by Kevin Lohman on 5/30/12.
//
#import "UIViewController+overView.h"
@implementation UIViewController (OverView)
#define kUIViewControllerOverViewDismissNotification @"OverViewDismissNotification"
const float kUIViewControllerOverViewAnimationDuration = 0.75;
const NSInteger kUIViewControllerOverViewTag = 8008135; // Arbitrary number, so as not to conflict
- (void)overViewDismissed
{
[self autorelease];
[[NSNotificationCenter defaultCenter] removeObserver:self name:kUIViewControllerOverViewDismissNotification object:self.view];
}
- (void)presentOverViewController:(UIViewController *)modalViewController animated:(BOOL)animated
{
UIView *toView = self.view;
CGRect finalRect = CGRectIntersection([[UIScreen mainScreen] applicationFrame], self.view.frame); // Make sure it doesn't go under menu bar
modalViewController.view.frame = finalRect;
modalViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
modalViewController.view.tag = kUIViewControllerOverViewTag+modalViewController.modalTransitionStyle; // Hiding some info here :)
if(animated)
{
switch(modalViewController.modalTransitionStyle)
{
// Currently only cross dissolve and cover vertical supported... if you add support let me know.
case UIModalTransitionStyleCrossDissolve:
{
float beforeAlpha = modalViewController.view.alpha;
modalViewController.view.alpha = 0;
[toView addSubview:modalViewController.view];
[UIView animateWithDuration:kUIViewControllerOverViewAnimationDuration animations:^{
modalViewController.view.alpha = beforeAlpha;
}];
break;
}
case UIModalTransitionStyleCoverVertical:
default:
{
modalViewController.view.frame = CGRectMake(modalViewController.view.frame.origin.x, modalViewController.view.frame.size.height,
modalViewController.view.frame.size.width, modalViewController.view.frame.size.height);
[toView addSubview:modalViewController.view];
[UIView animateWithDuration:kUIViewControllerOverViewAnimationDuration animations:^{
modalViewController.view.frame = finalRect;
}];
break;
}
}
}
else {
[toView addSubview:modalViewController.view];
}
[modalViewController retain]; // Keep it around until we dismiss it.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(overViewDismissed) name:kUIViewControllerOverViewDismissNotification object:modalViewController.view]; // Release will happen when this notification is posted
}
NSInteger transitionStyleForTag(tag)
{
if (tag >= kUIViewControllerOverViewTag && tag <= kUIViewControllerOverViewTag+UIModalTransitionStylePartialCurl)
{
return tag-kUIViewControllerOverViewTag;
}
else {
return -1; // Not a Over View
}
}
- (void)dismissOverViewControllerAnimated:(BOOL)animated
{
UIView *overView = transitionStyleForTag(self.view.tag) >= 0 ? self.view : nil; // Can dismiss ourselves
for(UIView *subview in self.view.subviews)
{
if(transitionStyleForTag(subview.tag) >= 0)
overView = subview; // Keep going, lets dismiss last presented first
}
if(!overView) return; // None to dismiss
if(animated)
{
switch(transitionStyleForTag(overView.tag))
{
// Currently only cross dissolve and cover vertical supported... if you add support let me know.
case UIModalTransitionStyleCrossDissolve:
{
float beforeAlpha = overView.alpha;
[UIView animateWithDuration:kUIViewControllerOverViewAnimationDuration animations:^{
overView.alpha = 0;
} completion:^(BOOL finished) {
[overView removeFromSuperview];
overView.alpha = beforeAlpha;
[[NSNotificationCenter defaultCenter] postNotificationName:kUIViewControllerOverViewDismissNotification object:overView];
}];
break;
}
case UIModalTransitionStyleCoverVertical:
default:
{
[UIView animateWithDuration:kUIViewControllerOverViewAnimationDuration animations:^{
overView.frame = CGRectMake(0, overView.frame.size.height, overView.frame.size.width, overView.frame.size.height);
} completion:^(BOOL finished) {
[overView removeFromSuperview];
[[NSNotificationCenter defaultCenter] postNotificationName:kUIViewControllerOverViewDismissNotification object:overView];
}];
break;
}
}
}
else {
[overView removeFromSuperview];
[[NSNotificationCenter defaultCenter] postNotificationName:kUIViewControllerOverViewDismissNotification object:overView];
}
}
@end
その後は、単にpresentOverViewController代わりのpresentModalViewControllerとdismissOverViewControllerの代わりdissmissModalViewControllerを使用し、それを使用します。
制限のカップルがあります:
- あなたが画面全体をカバーするために をしたいとあなたは の内側にVCを持っているので、もしあなたが、ルート最もビューコントローラに提示しなければなりませんUINavigationController、それをナビゲーションコントローラに提示します。
- 古いiOSでローテーションに関する問題が発生することがありました。 ビルド(4.0またはそれ以上)
- 現在、クロスディゾルブおよびカバー垂直アニメーションのみを処理しています。
すてきできちんとした解決策、ありがとう!しかし、2つの観察。 最初に、通知ハンドラの 'overViewDismissed'がモーダルビューコントローラではなく自己を解放し、クラッシュします。通知コードaddObserver/postNotificationを完全に削除し、現在の/解除メソッド外のモーダルビューコントローラのメモリを管理します。 第2に、[[[UIScreen mainScreen] applicationFrame] 'は必ずしも正しいフレームサイズを返しません。代わりに 'self.view.superview.frame'を使用します([この回答](http://stackoverflow.com/a/4052442/22764)を参照)。 –
@VladimirGrigorovねえ、ありがとう、それはいくつかの悪いロジックがあるようです。私はこれを置くコードベースを覚えていませんが、私はそれをローカルに修正したと想像してください...あなたがまだどこかの固定バージョンをコンパイル/実行しているなら、あなたの発見に基づいて答えを編集できますか?私はそれを変更することができます(self.parentViewController autoreleaseに変更するだけですか?)ぼんやりと変更するために私に危険があります:) – BadPirate
私は以前のコメントで述べたとおり通知コードを削除しました。テストに合格しました... –
私のための答えは、コードの1行だったが、モーダルビューコントローラを提示する前に、親ビューコントローラに追加:モーダルビューはいったん
self.modalPresentationStyle = UIModalPresentationCurrentContext;
をこれが削除されてから親ビューを停止します追加されました。
- 1. 透明なモーダルの背景
- 2. 背景色の前にホバーの透明な背景イメージを変更する
- 3. 透明な背景でイメージの色を変更する
- 4. アンドロイドベクターの背景色は透明です
- 5. 透明な背景を持つモーダルUISplitViewController
- 6. 背景色を透明な背景画像で表示する
- 7. 保存された透明ビットマップの背景色を変更するには
- 8. モーダルがNavigationControllerにあるとき、背景が透明でない
- 9. Androidステータスバーで背景色を半透明色に設定
- 10. Androidツールバーで背景色を半透明色に設定
- 11. ビューポートの背景またはボディタグの背景色に子要素の背景色(透明)を作る方法
- 12. Flash Builderで背景色を透明にする方法
- 13. Divを背景色で透明にする方法
- 14. Javascript - 時間間隔で背景色の不透明度を変更する
- 15. CSSの不透明度 - 背景色
- 16. 背景色のCSS不透明度
- 17. 透明な画像 - 背景色
- 18. 透明イメージのドロップシャドウと背景色
- 19. 透明な背景色のQDialog
- 20. EditText背景色不透明度アンドロイド
- 21. ホバーの背景色の不透明度
- 22. FFMPEG波形透明、背景無地色
- 23. GIFの透明な背景が黄色に変わった
- 24. 背景色を白から透明に変更してください
- 25. アンドロイドアプリでソフトキーの背景を黒から透明に変更
- 26. 半透明の背景を持つモーダルViewControllerを提示する
- 27. 背景画像の不透明度と親の背景色
- 28. プログレスバーの背景色を透明にするC#
- 29. CSSで背景画像の不透明度を変更する
- 30. CSSで背景/不透明度ビデオを変更する
[UIcolor clearcolor]を使用できます。 – Raxit
これはiOS向けのものです。 – BoltClock
どのモーダルダイアログを使用していますか? – Eiko