开发者社区 问答 正文

怪异的自动收费中心问题

这件事一直困扰着我。

基本上,当我使用布局锚手动定义autolayout约束,并在弹出器中使用视图控制器时,中心位于错误的位置。它似乎围绕着从弹出箭头的左边到左边和右边边缘的边界,这不是弹射区域的中心。

这似乎与其他UIViewController表示方法(如UIModalPresentationFormSheet)工作得很好。

有什么想法吗?我怎样才能以一种对布局友好的方式解决这个问题,而不需要特殊的边框?

PS。如果将布局固定在父视图的中心,则会发生完全相同的情况。

-(void)loadView {

UIView *view = [[UIView alloc] init];

[![enter image description here][1]][1] [view setBackgroundColor:[UIColor greenColor]]; [view setTranslatesAutoresizingMaskIntoConstraints:NO]; self.view = view;

UIView *parentView = [[UIView alloc] init];

[parentView setTranslatesAutoresizingMaskIntoConstraints:NO];
[parentView setBackgroundColor:[self colorForTag:i]];
[self.view addSubview:parentView];
// constrain parent view.
[parentView.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:10.0].active = YES;
[parentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-10.0].active = YES;

}

展开
收起
游客5akardh5cojhg 2019-12-05 13:23:58 402 分享 版权
阿里云 AI 助理回答

遇到在弹出视图控制器时自动布局约束不按预期工作的问题,通常是因为弹出视图的呈现方式或容器视图的约束设置未正确处理。针对您的情况,这里有几个建议来解决中心定位问题:

  1. 检查弹出器的约束和属性: 确保弹出视图控制器的modalPresentationStyle被正确设置。如果使用自定义弹出器,请检查其内容视图的约束是否正确地将子视图居中。可能需要手动调整弹出视图的约束以确保它相对于父视图正确居中。

  2. 使用居中约束: 虽然您提到直接将视图固定在父视图中心也出现问题,但请确保您是这样设置居中约束的:

    [parentView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES;
    [parentView.centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor].active = YES;
    

    这应该使parentView在其父视图中完全居中。

  3. 考虑弹出视图的尺寸: 弹出视图的尺寸可能影响其在屏幕上的位置。确认视图大小与期望的一致,并且没有其他约束冲突导致位置偏移。

  4. 检查弹出视图控制器的presentingViewController设置: 确保调用presentViewController:animated:completion:方法的视图控制器正确无误,因为这会影响弹出视图的上下文和布局。

  5. 自定义弹出视图容器: 如果上述方法都无法解决问题,您可以创建一个自定义的UIViewControllerAnimatedTransitioningUIViewControllerTransitioningDelegate来完全控制弹出视图的动画和布局过程。通过这种方式,您可以精确控制视图如何以及在哪里出现。

  6. 调试视图层次和约束: 使用Xcode的“视图调试器”工具查看运行时的视图层次结构和约束,这有助于识别任何可能导致布局异常的约束冲突或错误配置。

  7. 避免硬编码值: 尽量不要在约束中使用硬编码的常数值(除非绝对必要),而是利用相对约束来保持界面的灵活性和适应性。

希望这些建议能帮助您找到并解决布局问题。如果问题依旧存在,可能需要更详细的代码审查或了解弹出器的具体实现细节。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: