【问题标题】:Frame of view is not updated in AutoLayout视图框架在 AutoLayout 中未更新
【发布时间】:2015-05-04 12:05:40
【问题描述】:

使用 AutoLayouts 获取更新的框架是一个问题,我知道并通过了它的解决方案。所有solutions 的效率都很高,但我的问题却一瘸一拐。

我做过的事情:

我有一个 UIView,我需要根据需要更改它的大小,因此我提供了一个密钥 setTranslatesAutoresizingMaskIntoConstraints 作为 YES。因为我已经为此 UIView 创建了约束并且约束不允许我更改/反映框架。现在我可以成功地更改框架,但新问题是 view 没有给出渲染坐标 [origin(x,y)]。原始值未更新。

如果我删除setTranslatesAutoresizingMaskIntoConstraints,那么它会起作用。但我需要它。

我尝试了其他解决方案,例如使用 - [view setNeedsLayout] and [view layoutIfNeeded] 更新调用时的 UI 或使用 -(void)viewDidLayoutSubviews 延迟检索渲染帧但没有任何效果。

【问题讨论】:

  • 您是否在情节提要中添加了视图及其约束?

标签: ios objective-c xcode uiview autolayout


【解决方案1】:

如果您有一些约束,不允许您更改坐标,那么您应该更改此约束,但不要更改框架...只需为此约束创建插座,更改 constant 属性并使用 layoutIfNeeded 方法

【讨论】:

    【解决方案2】:

    首先,如果你使用自动布局,你需要设置 translatesAutoresizingMaskIntoConstraints = NO

    但回到你的问题。您可以做的一件事是使用 KVO(键值观察器)在视图边界发生变化时通知您。例如:

    [self.view addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionPrior context:nil];

    然后,创建一个观察者方法,如:

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    
      CGRect frame  = self.view.frame;
    
    }
    

    您应该能够从框架获得宽度和高度。请注意,此方法可能会被多次调用..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 2015-10-30
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多