4

Xcode 4.6 で iOS 6 iPhone アプリを作成していますが、次のタイプのポップアップ ウィンドウを実現する最善の方法について疑問に思っています。

ポップオーバースクリーンショット

具体的には、右側の iPhone のスクリーンショットです。ユーザーがメイン ウィンドウの顔または UIView をタップすると、部分的に透明なポップオーバーが表示され、ポートレート写真やテキスト データなどの詳細情報が表示されますが、元のビューは(写真コレクションはこちら) は表示されたままになり、タイマー/カウンターはそのビューで刻み続けます。

これが可能な解決策になると思いましたiPhone Modal View 画面よりも小さいですが、私にはうまくいきません。上に表示されていないのは、ユーザーが下のビューに戻ることができるように、ポップオーバーにも配置する予定のキャンセル ボタンです。タイマーが切れると、詳細ビ​​ューも消えます。

presentModalViewController とプレゼンター/提示されたスキームを使用するか、ストーリーボード セグエを使用して親子ビュー関係を使用するか、loadNibNamed を使用するか、フルスクリーン以外のモーダルを表示するという iPhone の制限を克服するために何らかのハックを使用する必要があります。見る?画面の大部分をカバーしますが、ポップオーバーにない情報(タイマーなど)をユーザーに提供するため、下のビューが表示され、アクティブであることを確認したいと思います。ユーザーは下の画面を操作する必要はありませんが、部分的に表示したいと思います。

ポップアップ ビューをメイン ストーリーボードの別のビュー コントローラーとして設計しました。xib ファイルとしてではありません。インターフェイス ビルダーから ProfileViewController と呼ばれるコードへの接続とアウトレットが形成されます。

警告: 私の用語は正しくなく、不正確である可能性があります。ポップアップまたはポップオーバーは、UIView、UIViewController、UIWindow、またはプログラム的に問題を解決するのに最適なものであれば何でもかまいません。機能が私が求めているものを反映している限り、私はそれが特定のウィジェットタイプであることに縛られていません。

ご提案いただきありがとうございます。

4

4 に答える 4

16

これを達成したいですか?

ここに画像の説明を入力

ここでは、2 つの異なるviewControllers1 つは他の 1 つです。vc2は背景付きのchildViewControllerです。あなたの場合、スタックの一番上にandを配置できます。vc1transparentUILabelbackgroundColor blackalpha = 0.5

のすべてのイベントは でvc2発生しvc2.mます。画像クリックで次のコードを使用します。

- (IBAction)imageClick 
{
    vc2 *viewController = [[vc2 alloc]init];
    [self addChildViewController:viewController];
    viewController.view.frame = self.view.frame;
    [self.view addSubview:viewController.view];
    viewController.view.alpha = 0;
    [viewController didMoveToParentViewController:self];

    [UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^
     {
         viewController.view.alpha = 1;
     }
                     completion:nil];
}

そして、これを透明にするためにこれをvc2.m入れます。viewDidLoadviewController

self.view.backgroundColor = [UIColor clearColor];
self.view.opaque = YES;

透明なビューを作成すると、すべてのコードが別のクラスにviewControllerなるため、コードがきれいになります。vc2

編集

まず、スクリーンショットに従って、丸い境界線とフレームになる aを追加UIViewします。xib

丸い境界線の場合、これを使用できますcategorybackgroundColorこれUIViewは次のようになりますclearColor

- (void)setRoundedBorder:(float) radius borderWidth:(float)borderWidth color:(UIColor*)color
{
    CALayer * l = [self layer];
    [l setMasksToBounds:YES];
    [l setCornerRadius:radius];
    // You can even add a border
    [l setBorderWidth:borderWidth];
    [l setBorderColor:[color CGColor]];
}

UILabel/UIView/UIImage次に、フレームが上記と等しくUIView、アルファが 0.5 で、背景色が黒の a を配置します。これは から直接実行できますxib。コードでフレームを設定する必要はありません。

次に、他のコントロールを内部に配置し始めますUIView

于 2013-10-22T05:23:10.717 に答える
7

これを試して

// create a new view
  UIView *viewPopup=[[UIView alloc]init];
  [viewPopup setBackgroundColor:[UIColor blackColor]];
  viewPopup.alpha=0.6f;

 // add into window
 AppDelegate *appdelgateobj=(AppDelegate *)[[UIApplication sharedApplication]delegate];
 [appdelgateobj.window addSubview:viewPopup];
 [appdelgateobj.window bringSubviewToFront:viewPopup];
于 2013-10-22T05:17:41.503 に答える
5

透明なビューについては、以下の手順に従います。

ステップ1: ここに画像の説明を入力

ステップ2:

ここに画像の説明を入力

  • 必要なときにいつでも Transpertview.hidden=NO:
  • 必要ないときはいつでも Transpertview.hidden=YES:

役立つかもしれません。

于 2013-10-22T05:31:39.377 に答える
1

.mファイルに#import <QuartzCore/QuartzCore.h>フレームワークを追加し、次のコードを使用します

UIWindow* window = [UIApplication sharedApplication].keyWindow;
    self.dimView = [[UIView alloc] initWithFrame:window.bounds];
    self.dimView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:.6];
    self.dimView.userInteractionEnabled = YES;
    [window addSubview:self.dimView];

上記は透明な dimView で、サイズはウィンドウに似ています。

self.searchTblContainerView = [[UIView alloc] init];
    self.searchTblContainerView.frame = CGRectMake(15, (window.frame.size.height - 300) / 2, 290, 300);
    self.searchTblContainerView.layer.cornerRadius = 15.f;
    self.searchTblContainerView.layer.borderColor = [UIColor blackColor].CGColor; /// set color as per your requirement
    self.searchTblContainerView.layer.borderWidth = 2.f;
    self.searchTblContainerView.alpha = 0.80; /// set as per your requirement 
    self.searchTblContainerView.clipsToBounds = YES;
    [self.dimView addSubview:self.searchTblContainerView];

上記は、ラベル、テキストフィールド、ボタンなどself.searchTblContainerViewの全体を含むメインビューであり、要件に従って設定します。UIControls

デフォルトで hidden プロパティを設定し、alertView (apple)のようなアニメーションに従って表示と非表示をself.dimView.hidden = YES; 行います

次のコードは、dimView を表示します。

self.searchTblContainerView.transform = CGAffineTransformMakeScale(0.01, 0.01);
        [UIView animateWithDuration:0.30 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
            self.searchTblContainerView.transform = CGAffineTransformIdentity;
            self.dimView.hidden = NO;
        } completion:^(BOOL finished){}];

        UIWindow* window = [UIApplication sharedApplication].keyWindow;
        [window bringSubviewToFront:self.dimView];

次のコードは、dimView を非表示にします。

 self.searchTblContainerView.transform = CGAffineTransformIdentity;
    [UIView animateWithDuration:0.30 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.searchTblContainerView.transform = CGAffineTransformMakeScale(0.01, 0.01);
    } completion:^(BOOL finished){
        self.dimView.hidden = YES;
    }];

上記のコードは単純なロジックであり、あなたの場合に役立つかもしれません。

于 2013-10-22T05:19:33.473 に答える