UIPopoverBackgroundView をサブクラス化して、ポップオーバーの外観をカスタマイズしています。矢印とコンテンツ ビューの間に隙間がある場合を除いて、すべて正常に動作しています。デバイスを回転させ続けてポップオーバーを閉じてから元に戻すと、並んでいる場合もあれば、並んでいない場合もあります。フレームサイズをログに記録していますが、それらは一貫して同じであるため、何が起こっているのかわかりません。スクリーンショットと私のlayoutSubviewsコードを以下に添付しています。
矢印の方向が右の場合に 4 を引いているところをご覧ください。これは、少なくともある程度の時間は動作させるための試行錯誤に基づいていました。このようなコーディングは嫌いです。なぜなら、この 4 ポイントのスペースが何であるかわからないからです。また、たとえば、矢印の方向のすべての場合にそれが必要ない理由もわかりません。
画像では、最初のショットが問題を示しています。これは、ポップオーバーのランダムなトリガーで発生しました。次の画像は、アプリの同じ実行内で後でトリガーされたときにランダムに動作することを示しています。
また、言及する価値があるのは、 http: //blog.teamtreehouse.com/customizing-the-design-of-uipopovercontrollerでいくつかのサンプル コードを見つけて、このバージョンの layoutSubviews を試したことです。このコードを使用しても、同じ問題が発生しました。
編集:私のスクリーンショットから明らかかもしれませんが、ポップオーバーの境界線を含めていないことに言及する価値があります:
+ (UIEdgeInsets)contentViewInsets
{
return UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f);
}
矢印の画像に画像ファイルを使用しているのではなく、カスタムで描画していることにも言及する価値があるかもしれません。繰り返しますが、図面をコメントアウトしてもまだ問題が発生しているため、関連しているとは思いませんが、完全な開示のために言及したかった.
どんな助けでも大歓迎です。ありがとう。
CGSize arrowSize = CGSizeMake(kCMAPopoverBackgroundViewArrowBase, kCMAPopoverBackgroundViewArrowHeight);
// Leaving code out for drawArrowImage - even when I leave the arrowImageView as
// an empty image view and set a non-clear background color this gap is still
// sporadically showing up
self.arrowImageView.image = [self drawArrowImage:arrowSize];
float arrowXCoordinate = 0.0f;
float arrowYCoordinate = 0.0f;
CGAffineTransform arrowRotation = CGAffineTransformIdentity;
float borderMargin = 2.0f;
switch (self.arrowDirection) {
case UIPopoverArrowDirectionUp:
arrowXCoordinate = ((self.bounds.size.width / 2.0f) - (arrowSize.width / 2.0f));
arrowYCoordinate = 0.0f;
break;
case UIPopoverArrowDirectionDown:
arrowXCoordinate = ((self.bounds.size.width / 2.0f) - (arrowSize.width / 2.0f));
arrowYCoordinate = self.bounds.size.height - arrowSize.height;
arrowRotation = CGAffineTransformMakeRotation(M_PI);
break;
case UIPopoverArrowDirectionLeft:
arrowXCoordinate = 0.0f - (arrowSize.height / 2.0f) + borderMargin;
arrowYCoordinate = ((self.bounds.size.height / 2.0f) - (arrowSize.height / 2.0f));
arrowRotation = CGAffineTransformMakeRotation(-M_PI_2);
break;
case UIPopoverArrowDirectionRight:
arrowXCoordinate = self.bounds.size.width - arrowSize.height - 4.0f;
arrowYCoordinate = ((self.bounds.size.height / 2.0f) - (arrowSize.height / 2.0f));
arrowRotation = CGAffineTransformMakeRotation(M_PI_2);
break;
default:
break;
}
self.arrowImageView.frame = CGRectMake(arrowXCoordinate, arrowYCoordinate, arrowSize.width, arrowSize.height);
[self.arrowImageView setTransform:arrowRotation];