动画后自动布局约束不起作用[重复]

Posted

技术标签:

【中文标题】动画后自动布局约束不起作用[重复]【英文标题】:Autolayout constraint is not working after animation [duplicate] 【发布时间】:2015-06-26 12:18:26 【问题描述】:

我对 AutoLayout 有点陌生。我已经知道有关此 autoLayout 的大量问题和教程,但我还没有找到我的解决方案。所以提前感谢您的帮助。

我的要求是什么?

我必须制作 UIView,它会在从屏幕底部按下带有动画的按钮后出现在屏幕上。(就像键盘一样)。我已经使用 autoLayout 在 xib 文件中制作了这个 UIView。到目前为止,我已经完成了这个。

在 ViewDidLoad 中:

//Loading custom UIView 
containerView = [[SharingPickerView alloc] init];
[containerView loadingMenus:pickerData];
[self.view addSubview:containerView];

在这个视图中它包含(滚动视图,然后是页面控制器,然后是取消按钮)

在 ViewWillLayoutSubviews 中:

-(void)viewWillLayoutSubviews
[super viewWillLayoutSubviews];

//Changing the frame of view to bottom side of the screen so that we can animate it later from bottom to top later.

containerView.frame = CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, containerView.frame.size.height);
[containerView setBackgroundColor:[[UIColor colorWithRed:231.0/255.0f green:231.0/255.0f blue:231.0/255.0f alpha:1.0f] colorWithAlphaComponent:0.3]];

现在正在新闻中制作动画。

-(void)sharePickerView
   [UIView animateWithDuration:1 animations:^()
   containerView.frame = CGRectMake(0,self.view.frame.size.height-containerView.frame.size.height, self.view.frame.size.width, containerView.frame.size.width);
    completion:^(BOOL isFinished)
  NSLog(@"Animation Finish");
   ];

在这里,我正在重新构建视图以显示该动画,但某些底部部分(该视图的取消按钮)未显示在 iPhone 6 模拟器中,但它完美地显示了 iPhone 5s 设备。

问候 埃蒙。

【问题讨论】:

这是一个关于如何轻松制作静态自动布局动画的教程youtube.com/watch?v=8KVKXlh6sKI 【参考方案1】:

尝试使用尺寸限制作为出口。然后,您可以轻松更改这些约束的值。不建议在使用自动布局时修改框架。

声明一个属性:

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *heightConstraint;

在实现中:

heightConstraint = self.view.frame.size.height;

这篇文章也可能会有所帮助: AutoLayout, Constraints and Animation

【讨论】:

【参考方案2】:

如果您使用的是NSAutoLayout,则不应重新构建。

    您必须在屏幕底部安装一个带有滚动条和视图父级的约束。请记住在实例化自定义视图时将 translatesAutoresizingMaskIntoConstraints 设置为 NO。

    创建此约束的 Outlet。

    当你需要改变动画时

    _ctScrollBottom.constant = self.view.frame.size.height-containerView.frame.size.height;
    
    [UIView animateWithDuration:animationDuration
                     animations:^()
                         [self.view  layoutIfNeeded];
                     ];
    

我计算了你的“y”位置,但我没有测试过;)

希望这会有所帮助!

【讨论】:

【参考方案3】:

这个答案https://***.com/a/26040569/2654425 可能非常有帮助,因为它处理了类似的情况。

【讨论】:

【参考方案4】:

我建议您以编程方式添加约束

    首先,将您的translatesAutoresizingMaskIntoConstraints 设置为NO

    containerView = [[SharingPickerView alloc] init];
    containerView.translatesAutoresizingMaskIntoConstraints = NO;
    [containerView loadingMenus:pickerData];
    [self.view addSubview:containerView];
    

    其次,为高度添加约束

    // for example, half height as view.
    
    self.heightConstraint = [NSLayoutConstraint
          constraintWithItem:containerView
                   attribute:NSLayoutAttributeHeight
                   relatedBy:NSLayoutRelationEqual
                      toItem:self.view
                   attribute:NSLayoutAttributeHeight
                  multiplier:0.5
                    constant:0.0]
    [self.view addConstraint:self.heightConstraint];`
    

将此约束作为属性:

@property (nonatomic, strong) NSLayoutConstraint *heightConstraint;

动画约束变化为

[UIView animateWithDuration:0.5
                 animations:^
                     self.heightConstraint.constant += Value_to_change;
                     [self.view layoutIfNeeded];
                 ];

另外,不要忘记添加尾随和前导约束 + 顶部约束

这是给你的好教程 http://www.thinkandbuild.it/learn-to-love-auto-layout-programmatically/

希望对你有帮助

【讨论】:

以上是关于动画后自动布局约束不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥自动布局约束不起作用?

iOS TableView 约束不起作用[重复]

自动布局约束不起作用

CGRectOffset 后自动布局不起作用

自动布局在 centerX-centerY 上不起作用

Swift 自动布局在 Xcode 9.3 中不起作用