16

この優れたチュートリアルを使用して、カスタムUIPopoverBackgroundViewクラスを作成しました。

それはうまくいきます。唯一の問題は、典型的なUIPopoverControllerのドロップシャドウが表示されないことです。UIPopoverBackgroundViewインスタンスのレイヤーで指定しようとしましたが成功しませんでした。UIPopoverControllerの私のインスタンスには、操作するためのパブリックビューがないようです。ポップオーバーコンテンツに追加することもできません。

おそらく本当に簡単です。カスタムUIPopoverBackgroundViewクラスを使用するときにドロップシャドウを追加するにはどうすればよいですか?

// UIPopoverBackgroundView.m

-(id)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        _borderImageView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"bg-popover.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(CAP_INSET,CAP_INSET,CAP_INSET,CAP_INSET)]];

        _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg-popover-arrow.png"]];

        [self addSubview:_borderImageView];
        [self addSubview:_arrowView];

        self.layer.shadowOffset = CGSizeMake(50, 50);
        self.layer.shadowColor = [[UIColor blackColor] CGColor];
    }

    return self;
}
4

2 に答える 2

19

独自のシャドウを追加する必要はありません。ベースUIPopoverBackgroundViewはあなたのためにそれを行います。layoutSubviews実装では必ずsuperを呼び出してください。

編集:私のコメントはiOS6をターゲットとするアプリに適用されます。

于 2012-10-02T04:41:26.540 に答える
14

わかりました、それを理解しました。borderImageViewポップオーバーインスタンスのビューではなく、にドロップシャドウを追加する必要がありました。

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        _borderImageView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"bg-popover.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(CAP_INSET,CAP_INSET,CAP_INSET,CAP_INSET)]];

        _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg-popover-arrow.png"]];

        [self addSubview:_borderImageView];
        [self addSubview:_arrowView];

        _borderImageView.layer.cornerRadius = 5.0f;
        _borderImageView.layer.masksToBounds = NO;
        _borderImageView.layer.borderWidth = 1.0f;
        _borderImageView.layer.borderColor = [UIColor blackColor].CGColor;

        _borderImageView.layer.shadowColor = [UIColor blackColor].CGColor;
        _borderImageView.layer.shadowOpacity = 0.8;
        _borderImageView.layer.shadowRadius = 50;
        _borderImageView.layer.shadowOffset = CGSizeMake(-10.0f, 10.0f);
    }

    return self;
}
于 2012-04-06T13:55:48.137 に答える