【问题标题】:Effects of removing constraints programmatically xcode以编程方式删除约束的效果 xcode
【发布时间】:2014-08-07 18:25:00
【问题描述】:

我正在使用故事板在 iOS 中制作动画界面。我有一个名为AnimatedViewUIView 子类,其中所有界面元素都作为其子视图。

我需要能够更改所有这些子视图的框架、变换、边界、alpha 等。事实证明这是一个问题。当我的AnimatedViewlayoutSubviews 方法被其父级调用时,它会调用一些名为_is_layoutUIView 私有方法,这会将我所有子视图的boundframe 属性更改回它们使用的属性成为。

如果我以编程方式添加 UIView,这不会发生并且一切正常,但我正在与图形设计师合作,我不希望他们不得不乱写代码。

经过反复试验,我发现删除AnimatedView 上的所有自动布局约束使其无法重置frames,但它仍会重置bounds。以下是 AnimatedView 被覆盖的 layoutSubviews 方法的样子:

-(void)layoutSubviews{
    [self createAnimationsFromPlist: filePath];
    [self removeConstraints: self.constraints];
    [super layoutSubviews];
    //set everything to its initial frame
    [self.animator animate:0];
}

通过消除约束,我是否走上了正确的道路?我已经阅读了auto layout guide,但我不明白为什么这会对我有所帮助。我没有在情节提要中使用 AnimatedView 的约束,但 self.constraints 出于某种原因有 20 个元素。

如果有帮助,下面是我如何为视图设置动画的示例:

    - (void)animateFrame:(NSInteger)time
{
    float angle = angleFrames[time];
    self.view.transform = CGAffineTransformMakeRotation(angle);
}

【问题讨论】:

    标签: ios uiview storyboard constraints autolayout


    【解决方案1】:

    使用自动布局时,您不能直接设置framecenterbounds 属性,并且转换可能无法按预期工作。

    所以是的,对于这种动画,最好让视图脱离 Auto Layout 的控制。

    【讨论】:

    • 太好了,谢谢!有没有更完整或更好的方法可以让这个视图脱离自动布局的控制?还是“removeConstraints”这样做?我不想为整个应用程序禁用自动布局,因为我将它用于其他一些视图元素,但这可能是我最好的选择吗?
    • 如果它是从笔尖加载的,您可以仅在该笔尖上禁用自动布局,或者您可以使用占位符约束对其进行定位,然后将 translatesAutoresizingMasksIntoConstraints 设置为 true 并适当地设置其 autoresizingMask
    • 我让它工作了!我将 AnimatedView 及其所有子视图的 translatesAutoresizingMasksIntoConstraints 设置为 YES。在您帮助我之前,这是一个令人头疼的问题,感谢您的帮助 Austin!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多