我正在使用一个使用 Jonathan Badeen 的 JLBPartialModal 类的新应用,这个类试图模仿国家地理公园指南中的界面。
我的问题是,当我尝试在第二个视图显示键盘时,第一次发生这一切看起来很好,问题是第二次出现,键盘较小但仍然以其原始尺寸工作。
第一次 http://i.stack.imgur.com/kByhh.png
第二次 http://i.stack.imgur.com/GNhbL.png
我不知道是否有办法强制第二个视图有成为第一个响应者。
希望有任何建议可以解决我的问题。
使用 IBAction
调用视图-(IBAction)accion:(id)sender{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
composeViewController *vc = [sb instantiateViewControllerWithIdentifier:@"composeView"];
JLBPartialModal *partialModal = [JLBPartialModal sharedInstance];
partialModal.delegate = vc;
[partialModal presentViewController:vc dismissal:^{
}];
}
该类有3个委托,其中一个是didPresentPartialModalView,我使用此委托在视图和动画结束后显示键盘:
#pragma mark - Partial modal delegate
- (void)didPresentPartialModalView:(JLBPartialModal *)partialModal
{
self.texto.editable = YES;
[self.texto becomeFirstResponder];
}
然后,当用户触摸关闭按钮时,UITextView具有 resignFirstResponder ,并且 NSNotificationCenter 我知道键盘已隐藏:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KeyboardWillHide:) name:UIKeyboardDidHideNotification object:nil];
}
- (IBAction)close:(id)sender
{
self.texto.editable = NO;
[self.texto resignFirstResponder];
}
-(void)KeyboardWillHide:(NSNotification *) notification {
[[JLBPartialModal sharedInstance] dismissViewController];
}
- (BOOL)shouldDismissPartialModalView:(JLBPartialModal *)partialModal
{
return YES;
}
谢谢。
最后!
我已解决了将 removedOnCompletion 添加到 JLBPartialModal.m
的问题- (CAKeyframeAnimation *)pullBackAnimation
- (CAKeyframeAnimation *)pushForwardAnimation
像这样:
- (CAKeyframeAnimation *)pullBackAnimation
{
CATransform3D startTransform = [self perspectiveTransform];
CATransform3D endTransform = CATransform3DConcat([self windowScaledTransform], startTransform);
CATransform3D middleTransform = CATransform3DConcat([self windowRotationTransform], startTransform);
CAKeyframeAnimation *anim = [self windowAnimation];
anim.values = @[[NSValue valueWithCATransform3D:startTransform], [NSValue valueWithCATransform3D:middleTransform], [NSValue valueWithCATransform3D:endTransform]];
anim.removedOnCompletion = YES; // Line added
return anim;
}
- (CAKeyframeAnimation *)pushForwardAnimation
{
CATransform3D endTransform = [self perspectiveTransform];
CATransform3D startTransform = CATransform3DConcat([self windowScaledTransform], endTransform);
CATransform3D middleTransform = CATransform3DConcat([self windowRotationTransform], startTransform);
CAKeyframeAnimation *anim = [self windowAnimation];
anim.values = @[[NSValue valueWithCATransform3D:startTransform], [NSValue valueWithCATransform3D:middleTransform], [NSValue valueWithCATransform3D:endTransform]];
anim.removedOnCompletion = YES; // Line added
return anim;
}
有了这个,我确保删除动画:D
答案 0 :(得分:1)
我用JLBPartialModal控件调查了一下。看起来作者添加了一个带有- (void)presentViewController:(UIViewController *)viewControllerToPresent dismissal:(void (^)(void))block
,
for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
if (window != self.window) {
[window.layer addAnimation:[self pullBackAnimation] forKey:@"pullBackAnimation"];
[UIView animateWithDuration:JLB_PARTIAL_MODAL_ANIMATION_DURATION animations:^{
window.center = CGPointMake(window.center.x, window.center.y - JLB_PARTIAL_MODAL_WINDOW_VERTICAL_OFFSET);
} completion:^(BOOL finished) {
if (!hasCalledDelegate) {
[self.delegate didPresentPartialModalView:self];
hasCalledDelegate = YES;
}
}];
}
}
然后在- (void)dismissViewController
中删除此动画。
for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
[window.layer removeAllAnimations];
}
他假设第一种方法中的windows
数组是解雇方法中的同一组窗口,我可能会质疑。您的键盘似乎位于一个窗口上,该窗口上设置了此缩放属性,但尚未删除。
因此,我建议您在修复组件问题时或作为临时修订时,执行第二个循环(removeAllAnimations)以响应显示的键盘。
如果没有看到您的代码,我不会百分之百地确信这是答案。您可能正在其他地方做一些影响窗口系统状态的事情。
编辑:既然您已发布代码,我想我可以看到问题。您注册的通知是KeyboardDidHide ...但您将其视为“WillHide”通知。当您在JLBPartialModal sharedInstance上调用dismissViewController
时,键盘不再位于[UIApplication sharedApplication].windows
属性中的一组窗口中。这意味着不会从包含键盘的窗口中删除动画。如果您将UIKeyboardDidHideNotification
更改为UIKeyboardWillHideNotification
,则可能会有效。