0

我有一个包含 UINavigationBar 和 UIScrollView 的 ViewController。在滚动视图中,我放置了其他视图来创建分页类型的东西。我完美地完成了这项工作,但我不得不解决一个非常奇怪的问题,即我在 UIScrollView 中的所有坐标值都加倍,但元素在 .frame.origin 中返回了正确的坐标。

不知道为什么会这样并且搜索并没有发现任何东西,我认为我一定是错的并进行了测试。

我创建了上面的场景,但在背景中我放置了一个 10x10 像素网格的测量图像。我在 viewDidLoad 中为 viewController 运行它:

[super viewDidLoad];
// Size to fit the screen
float height = [[UIScreen mainScreen] bounds].size.height;
height -= [UIApplication sharedApplication].statusBarFrame.size.height;
height -= self.navBar.frame.origin.y;
height -= self.navBar.frame.size.height;
CGRect frame = self.scrollView.frame;
frame.size.height = height;
self.scrollView.frame = frame;

frame.origin.y = 10;
testUIView *testView = [[testUIView alloc] initWithFrame:frame];
[self.scrollView addSubview:testView];

结果证实了我最黑暗的恐惧。网格显示在 testView 下,显示两个十像素的块。价值确实翻了一番 - 但为什么会这样,我该怎么办?

[编辑]

出于好奇,这里是插入视图的代码:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [[NSBundle mainBundle] loadNibNamed:@"testUIView" owner:self options:nil];

        self.view.frame = frame;

        [self addSubview:self.view];
        [self.spinner startAnimating];
    }
    return self;
}
4

2 回答 2

1

从您的代码中不清楚您是如何确定某物“加倍”的,但原因几乎可以肯定是您混淆了点和像素,并且您在 Retina 设备上运行。

几乎所有坐标(尤其是 中的东西CGPoint)都以点数给出。在 Retina 显示器上,每个点有 4 个像素(两行乘两列)。这称为scale,对于 Retina 显示器来说是“2”。有关更多详细信息,请参阅在视图中支持高分辨率屏幕。

于 2013-03-17T20:42:18.287 回答
1

这里的教训是“尽量保持观察力”以及“不要遗漏细节”。

x 和 y 值加倍,因为在 initWithFrame 中,框架直接应用于子视图,该子视图是来自 xib 的 IBOutlet。添加未修改的框架意味着 x 和 y 值保留在视图的坐标空间内。因此,视图出现在父视图中的 y=10 处,子视图出现在视图中的 y=10 处,导致布局将子视图放置在 y=20 处。

解决方案:在将其应用于子视图之前重置框架原点。

这是尖尖的帽子时间!

于 2013-03-18T13:01:06.690 回答