0

UIPopover ビューに似たカスタム UIView を構築しています。単に UIView クラスをサブクラス化し、内部にコントロールとイベントを構築します。このビューを表示するには、このように My sub Class データソースを介して superView を割り当てます

    if ([dataSource respondsToSelector:@selector(containerView)]) 
        superView = [dataSource containerView];

そしてそれを示すために、私はこのようにそれを行う関数を持っています

- (void) showPopOverFromRect : (CGRect) rect
{
    CGSize popSize = self.frame.size;

    float yPoint;

    if(ntPopOverDirection == NTPopOverArrowDirectionUP)
        yPoint = rect.origin.y + 10;
    else
        yPoint = rect.origin.y - 10;

    self.frame = CGRectMake(rect.origin.x - popSize.width, yPoint , popSize.width, popSize.height);

    [superView addSubview:self];
}

だから私の質問..ユーザーが UIPopOverController のようにスーパービューの AnyWhere をタップした場合、どうすればこのビューを閉じる(削除する)ことができますか?

4

2 に答える 2

3

カスタム UIView を作成して、スーパービュー全体または画面全体をクリアな背景または放射状グラデーションで埋めることをお勧めします。次に、この中に、ポップオーバーのルック アンド フィールを持つ別の UIView を配置します。

これにより、タップをキャプチャしようとしたり、他のビューから通知を送信したりする問題が解消されます。それはすべて自己完結型になります。

カスタム ビュー内にジェスチャ レコグナイザーを簡単に追加して、ユーザーが透明な領域に触れたときにビューを閉じることができます。

于 2012-04-30T15:16:22.420 に答える
-1

クリアな新しい UIView の下に UIButton を配置できます。この新しいボタンを押すと、ビューが閉じられ、スーパービューから削除されます。

何かのようなもの:

- (void) showPopOverFromRect : (CGRect) rect
{
    CGSize popSize = self.frame.size;

    float yPoint;

    if(ntPopOverDirection == NTPopOverArrowDirectionUP)
        yPoint = rect.origin.y + 10;
    else
        yPoint = rect.origin.y - 10;

    self.frame = CGRectMake(rect.origin.x - popSize.width, yPoint , popSize.width, popSize.height);

    UIButton *dismissButton = [UIButton buttonWithType:UIButtonTypeCustom];
    dismissButton.backgroundColor = [UIColor clearColor];
    dismissButton.frame = [[UIScreen mainScreen] bounds];
    [dismissButton addTarget:self.delegate action:@selector(dismissPopover) forControlEvents:UIControlEventTouchUpInside];
    [superview addSubview:dismissButton];

    [superView addSubview:self];
}

ただし、ビューを設定して、ポップオーバーを閉じるメッセージを受け取るデリゲートとしてスーパービューを設定する必要があります。

于 2012-04-30T15:06:10.667 に答える