我通过继承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];
答案 0 :(得分:1)
你的箭头图像是方形的吗?如果没有,我猜测变换会略微影响它的帧,这就产生了意想不到的差距。
答案 1 :(得分:0)
可能您在计算中得到了子像素值(很可能是0.5)
尝试使用floorf
或ceilf
确保您的值完全按照像素积分值着陆。
例如......
arrowXCoordinate = floorf(((self.bounds.size.width / 2.0f) - (arrowSize.width / 2.0f)));
请参阅floor参考。