CollisionBehaviour 不适用于自动布局
CollisionBehaviour do not working with autolayout
我正在尝试实现两个视图之间的碰撞。
firstView
是带有文本字段的视图。如果某些文本字段成为 firstRecognizer 并且键盘框架重叠 firstView
。它向上移动,如果 firstView
与 secondView
相撞,它也应该向上推。但这不会发生。相反 firstView
向上移动直到与 secondView
碰撞,然后放回原来的位置。
这里是我使用的代码:
- (void) keyboardChangeValueWithFrame:(CGRect)keyboardFrame isOpening:(BOOL)isOpening isClosing:(BOOL)isClosing {
CGFloat animTime = .3f;
if (isOpening && !isClosing) {
CGRect authFillerViewFrame = self.regFillerView.frame;
CGFloat rectDif = keyboardFrame.origin.y - authFillerViewFrame.origin.y - authFillerViewFrame.size.height;
if ([_animator.behaviors containsObject:_collision]) {
[_animator removeBehavior:_collision];
}
if (rectDif < 0) {
[self.view layoutIfNeeded];
self.regFillerViewHorizCenterConst.constant = rectDif;
[self.logoView layoutIfNeeded];
[UIView animateWithDuration:animTime animations:^{
_collision = [[UICollisionBehavior alloc] initWithItems:@[self.regFillerView, self.logoView]];
_collision.translatesReferenceBoundsIntoBoundary = NO;
_collision.collisionDelegate = self;
_collision.collisionMode = UICollisionBehaviorModeItems;
[_animator addBehavior:_collision];
_collision.action = ^{
};
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
if (finished) {
//
}
}];
}
} else if (!isOpening && isClosing) {
[self.view layoutIfNeeded];
self.regFillerViewHorizCenterConst.constant = 0.f;
[UIView animateWithDuration:animTime animations:^{
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
//
}];
}
}
有人能告诉我错误吗?
或者,有人知道更好的解决方案吗?
我找到了解决方案。我的错误是在调用 layoutIfNeeded
之前向动画师添加了碰撞行为。
现在我在添加碰撞行为之前调用 layoutIfNeeded
并且效果很好。
[UIView animateWithDuration:animTime animations:^{
_collision = [[UICollisionBehavior alloc] initWithItems:@[self.regFillerView, self.logoView]];
[self.view layoutIfNeeded];
_collision.translatesReferenceBoundsIntoBoundary = NO;
_collision.collisionDelegate = self;
_collision.collisionMode = UICollisionBehaviorModeItems;
[_animator addBehavior:_collision];
_collision.action = ^{
};
} completion:^(BOOL finished) {
if (finished) {
//
}
}];
我正在尝试实现两个视图之间的碰撞。
firstView
是带有文本字段的视图。如果某些文本字段成为 firstRecognizer 并且键盘框架重叠 firstView
。它向上移动,如果 firstView
与 secondView
相撞,它也应该向上推。但这不会发生。相反 firstView
向上移动直到与 secondView
碰撞,然后放回原来的位置。
这里是我使用的代码:
- (void) keyboardChangeValueWithFrame:(CGRect)keyboardFrame isOpening:(BOOL)isOpening isClosing:(BOOL)isClosing {
CGFloat animTime = .3f;
if (isOpening && !isClosing) {
CGRect authFillerViewFrame = self.regFillerView.frame;
CGFloat rectDif = keyboardFrame.origin.y - authFillerViewFrame.origin.y - authFillerViewFrame.size.height;
if ([_animator.behaviors containsObject:_collision]) {
[_animator removeBehavior:_collision];
}
if (rectDif < 0) {
[self.view layoutIfNeeded];
self.regFillerViewHorizCenterConst.constant = rectDif;
[self.logoView layoutIfNeeded];
[UIView animateWithDuration:animTime animations:^{
_collision = [[UICollisionBehavior alloc] initWithItems:@[self.regFillerView, self.logoView]];
_collision.translatesReferenceBoundsIntoBoundary = NO;
_collision.collisionDelegate = self;
_collision.collisionMode = UICollisionBehaviorModeItems;
[_animator addBehavior:_collision];
_collision.action = ^{
};
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
if (finished) {
//
}
}];
}
} else if (!isOpening && isClosing) {
[self.view layoutIfNeeded];
self.regFillerViewHorizCenterConst.constant = 0.f;
[UIView animateWithDuration:animTime animations:^{
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
//
}];
}
}
有人能告诉我错误吗? 或者,有人知道更好的解决方案吗?
我找到了解决方案。我的错误是在调用 layoutIfNeeded
之前向动画师添加了碰撞行为。
现在我在添加碰撞行为之前调用 layoutIfNeeded
并且效果很好。
[UIView animateWithDuration:animTime animations:^{
_collision = [[UICollisionBehavior alloc] initWithItems:@[self.regFillerView, self.logoView]];
[self.view layoutIfNeeded];
_collision.translatesReferenceBoundsIntoBoundary = NO;
_collision.collisionDelegate = self;
_collision.collisionMode = UICollisionBehaviorModeItems;
[_animator addBehavior:_collision];
_collision.action = ^{
};
} completion:^(BOOL finished) {
if (finished) {
//
}
}];