动画约束导致子视图布局在屏幕上可见

DBoyer

我有一个正在创建的消息屏幕,我快完成了。我使用nib文件和约束构建了大多数视图。我有一个小错误,但是由于要求在涉及约束的动画块中调用[self.view layoutIfNeeded],因此在关闭键盘时可以直观地看到一些单元的布局。这是问题所在:

- (void)keyboardWillHide:(NSNotification *)notification
{
    NSNumber *duration = [[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curve = [[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey];

    [UIView animateWithDuration:duration.doubleValue delay:0 options:curve.integerValue animations:^{
        _chatInputViewBottomSpaceConstraint.constant = 0;
        // adding this line causes the bug but is required for the animation.
        [self.view layoutIfNeeded]; 
    } completion:0];
}

是否可以在视图中直接调用布局(如果需要),因为这也会导致我的集合视图自行布局,这有时会使单元格在屏幕上可见。

我尝试了所有可以想到的方法,但找不到该错误修复的解决方案。我已经尝试调用[cell setNeedLayout]; 在所有可能的位置,什么都没有发生。

dfmuir

这个怎么样?

在您的UITableViewCell中实现一个名为MYTableViewCellLayoutDelegate的自定义协议

@protocol MYTableViewCellLayoutDelegate <NSObject>
@required
- (BOOL)shouldLayoutTableViewCell:(MYTableViewCell *)cell;

@end

为此协议创建一个委托@property(非原子的,弱的)id layoutDelegate;

然后在UITableViewCell上覆盖layoutSubviews:

- (void)layoutSubviews {
    if([self.layoutDelegate shouldLayoutTableViewCell:self]) {
        [super layoutSubviews];
    }
}

现在,在您的UIViewController中,您可以实现shouldLayoutTableViewCell:回调以控制是否对UITableViewCell进行布局。

-(void)shouldLayoutTableViewCell:(UITableViewCell *)cell {
    return self.shouldLayoutCells;
}

修改keyboardWillHide方法以禁用单元格布局,调用layoutIfNeeded,并在完成块中恢复单元格布局功能。

- (void)keyboardWillHide:(NSNotification *)notification {
    NSNumber *duration = [[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curve = [[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey];

    self.shouldLayoutCells = NO;
    [UIView animateWithDuration:duration.doubleValue delay:0 options:curve.integerValue animations:^{
        _chatInputViewBottomSpaceConstraint.constant = 0;
        [self.view layoutIfNeeded]; 
    } completion:completion:^(BOOL finished) {
        self.shouldLayoutCells = NO;
    }];
}

由于您没有提供示例代码,因此我无法真正测试此功能,但希望这将使您走上正确的道路。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

视图在约束布局中不可见

CAGradientLayer导致子视图不可见

约束布局在布局文件上不可见...并且在扩大其上的任何视图时出现错误

自动布局动画约束不会为子视图设置动画

约束布局在设备/模拟器上不可见

在Android约束布局中关闭屏幕的动画视图

如何为约束布局上的嵌套视图设置动画?

约束布局 - 如何使图像视图(框架)在整个屏幕上移动

约束布局导致视图重叠

当文本视图太长而无法让其他视图可见时,约束布局会包裹 textview 但约束宽度

布局可见性动画

当动画在屏幕上不可见时,WPF 停止动画

动画导致按钮不可见

使视图的可见性从动画变为可见

相对布局中不可见的视图

约束布局使设备上的视图不在屏幕上显示,但无法在AVD上显示

在约束布局中创建和动画视图

屏幕上可见的RecyclerView内部布局的百分比

可疑的大小这将使视图不可见(在子布局中)

当部分在屏幕上可见时,CSS 动画仅播放一次

动态将子视图添加到单元格会导致布局约束错误输出

如果在约束布局中某些视图可见性消失了,如何将约束设置为其他视图?

Proguard启用时,Firebase Analytics屏幕视图事件在crashlytics上不可见

回收者视图可见性问题,它不在屏幕上

如何禁用列表视图中的所有元素(以及当前在屏幕上不可见的元素)?

Android Studio 2.2约束布局按钮不可见

动画视图并在动画后保持可见

JavaFX - MeshViews 在屏幕上不可见

可见项目不在屏幕上