使用自定义iPad弹出窗口将箭头与内容视图对齐

时间:2013-07-11 14:09:48

标签: ios objective-c uipopovercontroller

我通过继承UIPopoverBackgroundView来定制我的popovers的外观。一切都运行正常,除了在某些情况下箭头和内容视图之间存在间隙。如果我继续旋转设备以解除弹出窗口然后将其重新启动,有时它们会排成一行,而其他人则不会。我正在记录帧大小并且它们始终相同,所以我不知道发生了什么。我在下面附上截图和我的layoutSubviews代码。

如果你看到我在箭头方向右侧减去4,那么这是基于试验&至少在某些时候让它工作的错误。我讨厌像这样的编码,因为我不确定4点的这个空间是什么,以及为什么我不需要它在箭头方向的所有情况下,例如。

在图像中,第1张照片显示问题。这发生在随机触发弹出窗口上。下一个图像显示它在应用程序的同一执行中稍后触发时随机工作。

另外值得一提的是,我在http://blog.teamtreehouse.com/customizing-the-design-of-uipopovercontroller找到了一些示例代码并尝试了这个版本的layoutSubviews,尽管它已经与我的版本非常相似。即使使用此代码,我仍然会看到相同的问题。

编辑:值得一提的是,从我的截图可能很明显,但我没有为我的popover包含边框:

+ (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];

Here is an example of the issue happening on a random occurrence

This is an example of it not happening on another random occurrence on the

2 个答案:

答案 0 :(得分:1)

你的箭头图像是方形的吗?如果没有,我猜测变换会略微影响它的帧,这就产生了意想不到的差距。

答案 1 :(得分:0)

可能您在计算中得到了子像素值(很可能是0.5)

尝试使用floorfceilf确保您的值完全按照像素积分值着陆。

例如......

arrowXCoordinate = floorf(((self.bounds.size.width / 2.0f) - (arrowSize.width / 2.0f)));

请参阅floor参考。