我从一个空项目开始,并添加了一个视图控制器及其笔尖。在nib内部,有一个视图,其中UIScrollView作为视图的子项。在scrollview中,我有多个资源,如文本字段,标签和按钮。
当键盘出现时,我希望我的scrollview向上移动。我查看了如何执行此操作的stackoverflow。我基本上复制了代码并试图理解它。但是,观点仍然没有提升。所以一些调试语句的时间......
我的UIScrollView被连接起来(IBOutlet)到RootViewController,可以从那里访问。我尝试打印出我的scrollView(实例名称),然后我得到了一个对象。但是,当我尝试打印出scrollView.frame ....我得到了null ...有没有人知道为什么会这样?
以下是一些带有一些调试语句的代码片段
- (void) moveScrollView:(NSNotification *) notification up: (BOOL) upFlag{
NSDictionary * userInfo = [notification userInfo];
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardEndFrame;
[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:animationCurve];
CGRect newFrame = scrollView.frame;
CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil];
NSLog(@"scrollView: %@", scrollView);
NSLog(@"frame: %@", scrollView.frame);
NSLog(@"Old Height: %@", scrollView.frame.size.height);
newFrame.size.height -= keyboardFrame.size.height * (upFlag ? 1 : -1);
NSLog(@"New Height: %@", newFrame.size.height);
scrollView.frame = newFrame;
[UIView commitAnimations];
}
- (void) keyboardShow:(NSNotification *) notification{
NSLog(@"Keyboard Show");
[self moveScrollView: notification up:YES];
}
答案 0 :(得分:3)
您无法使用%@打印框架。 %@打印Objective C对象; frame不是Objective C对象。它是一个C结构,CGRect。单独打印其组件,如下所示:
NSLog(@"frame: (%0f %0f; %0f %0f)",
scrollView.frame.origin.x, scrollView.frame.origin.y,
scrollView.frame.size.width, scrollView.frame.size.height);
我认为使用调试器更有效。在调试器中,您可以使用
po object
打印Objective C对象,
print (CGRect)[scrollView frame]
打印框架。
顺便说一句,在Apple的文档中调整键盘滚动视图的推荐方法是设置内容插入,而不是更改框架。我也开始改变框架并且遇到了奇怪的问题。
答案 1 :(得分:1)
打印框架
NSLog(@"%@", NSStringFromRect(frame));`
答案 2 :(得分:0)
您确定在加载视图时调用moveScrollView方法吗?
尝试在-viewDidLoad方法中设置断点,并确保在moveScrollView方法之前调用它。
希望这有帮助, 文森特