- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图在键盘隐藏 UITextField
时移动 UIScrollView
,方法是使用显示的 contentInsets
更改大小。
但是,它不适用于键盘高度。键盘高度为 216,但如果我将底部插图设置为 iPhone 纵向模式的 515 和 iPhone 横向模式的 310,它只会在正确的位置停止滚动。为什么这些尺寸会如此不同?我不想硬编码这些任意值。
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.frame = self.parentViewController.view.frame;
[self.textView becomeFirstResponder];
NSLog(@"scrollview: %f,%f, parent: %f,%f", self.view.frame.size.height, self.view.frame.size.width, self.parentViewController.view.frame.size.height, self.parentViewController.view.frame.size.width);
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)keyboardWasShown:(NSNotification *)notification
{
if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) {
// Step 1: Get the size of the keyboard.
CGFloat keyboardHeight = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;
// Step 2: Adjust the bottom content inset of your scroll view by the keyboard height.
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardHeight, 0.0);
((UIScrollView*)self.view).contentInset = contentInsets;
((UIScrollView*)self.view).scrollIndicatorInsets = contentInsets;
// Step 3: Scroll the target text field into view.
CGRect aRect = self.view.frame;
aRect.size.height = aRect.size.height - keyboardHeight;
if (!CGRectContainsPoint(aRect, self.textView.frame.origin) ) {
CGPoint scrollPoint = CGPointMake(0.0, self.textView.frame.origin.y - keyboardHeight);
[((UIScrollView*)self.view) setContentOffset:scrollPoint animated:YES];
}
}
}
- (void) keyboardWillHide:(NSNotification *)notification {
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
((UIScrollView*)self.view).contentInset = contentInsets;
((UIScrollView*)self.view).scrollIndicatorInsets = contentInsets;
}
编辑:
在键盘打开之前,我打印出来:
NSLog(@"scrollview: %f,%f, parent: %f,%f", self.view.frame.size.height, self.view.frame.size.width, self.parentViewController.view.frame.size.height, self.parentViewController.view.frame.size.width);
它打印出这个:
scrollview: 431.000000,320.000000, parent: 431.000000,320.000000
最佳答案
我认为主要问题是您需要使用 UIKeyboardFrameEndUserInfoKey
而不是 UIKeyboardFrameBeginUserInfoKey
。
话虽如此,我已经编写了此方法的不同版本,即使 ScrollView 未放置在屏幕底部也可以使用,并且可能更适合您:
请注意,我使用 self.activeTextField
而不是 self.textField
。
// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
// Calculate the frame of the scrollview, in self.view's coordinate system
UIScrollView *scrollView = self.scrollView;
CGRect scrollViewRect = [self.view convertRect:scrollView.frame fromView:scrollView.superview];
// Calculate the frame of the keyboard, in self.view's coordinate system
NSDictionary* info = [aNotification userInfo];
CGRect kbRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
kbRect = [self.view convertRect:kbRect fromView:nil];
// Figure out where the two frames overlap, and set the content offset of the scrollview appropriately
CGRect hiddenScrollViewRect = CGRectIntersection(scrollViewRect, kbRect);
if (!CGRectIsNull(hiddenScrollViewRect))
{
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, hiddenScrollViewRect.size.height, 0.0);
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
}
[self scrollToActiveTextField];
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
self.scrollView.contentInset = UIEdgeInsetsZero;
self.scrollView.scrollIndicatorInsets = UIEdgeInsetsZero;
}
- (void)scrollToActiveTextField
{
if (self.activeTextField)
{
CGRect visibleRect = self.activeTextField.frame;
visibleRect = [self.scrollView convertRect:visibleRect fromView:self.activeTextField.superview];
visibleRect = CGRectInset(visibleRect, 0.0f, -5.0f);
[self.scrollView scrollRectToVisible:visibleRect animated:YES];
}
}
关于ios - UIScrollView 内容插图不适用于键盘高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16705159/
我有一个 png 文件 (1603px x 75px),我想将其用作某个部分的边框。但我希望它出现在内部(插图)而不是外部。但我无法弄清楚如何使边框图像恰好进入(插入)图像高度,而不会使图像的垂直尺寸
UIViewController ContainerView -> UITableViewController界面 View ContainerView -> UIViewController 当显示
我正在努力使我的标题具有漂亮的浮雕外观。它在 Chrome 中运行良好,但 Firefox 退出了。我怎样才能使这种效果在两者中都起作用?这是 fiddle : https://jsfiddle.ne
我有一个包含按钮的 UIBarButtonItem,我在该按钮上为按下/未按下状态设置了自定义背景图像。按下的图像向下移动 4px,因此未按下时的文本看起来垂直居中。我知道我可以使用 [button
uitabbarcontroller子类 隐藏/删除原始选项卡栏 将自定义视图置于uitabbarcontroller视图的底部 uitabbarcontroller->uiviewcontrolle
我试图在一个简单的客户端-服务器程序中说明 Nagle 算法。但我不太明白,也无法将其清楚地打印给我。 在我的示例中,客户端只是生成从 1 到 1024 的整数并将它们发送到服务器。服务器只是将这些
我正在使用 Netbeans GUI,我想在 jTextField 的开头添加 3 个像素的空间: 我已经尝试在 GUI 中使用 setMargin 和 setInset,但它没有改变任何东西。 我还
有没有办法使用 CSS3 在文本输入框上获得插入/内部阴影?下面的插入代码只会做盒子 -moz-box-shadow:inset 0 0 10px #000000; box-shadow:i
我正在对 CSS3 的新功能进行一些测试,但这种组合仅适用于最新版本的 Chrome 和 Firefox,但不适用于 Safari 或 Opera: box-shadow: inset
我想像这样使用 CSS3 获得文本字段效果:- 我尝试使用 CSS3 做到这一点,但未能获得完全相同的外观,请在 jsfiddle.net 中找到我的代码 CSS .field { -webkit-b
我正在使用 knitr::rmarkdown (但 knitr::knitr 和我的 VignetteEngine 一样) .然后我使用 devtools::build_vignettes() 构建我
我有一个具有固定布局边距的 StackView,为所有子元素提供左侧和右侧的边距。这对于大多数子元素(如标签等)非常有用。但是,我还有一个 tableView 作为子元素,它为单元格(例如字幕原型(p
我注意到来自 iPhone 专用应用程序和 Apple Watch 兼容应用程序的推送通知之间存在差异,我希望我的 Watch 兼容应用程序显示与普通 iPhone 专用应用程序推送通知类似的通知。
我正在尝试使用 d3.js 绘制 map ,该 map 具有城市 map 的一部分偏移并绘制在不同的位置( map 插图)。有使用 d3.js 的工作示例吗?如果没有,我是否可以使用不同的 .json
所以,这就是它需要的样子 你在中心看到漂亮的白色效果,我试图重新创建它,但没有成功,这是我的代码: article .txt:after{ position:absolute; c
我在 中添加了一个框阴影并添加了一个 元素到 div。框阴影显示在 div 上,但它不会影响视频元素。 这是预期的行为吗,有没有办法让方框阴影也影响视频? 代码片段: .video-player {
设置: 我正在 Xcode 5 中处理一个显示一组文本字段的 View 。为了在键盘出现时处理滚动,我使用 ScrollView 来放置我的 TextFields。我使用自动布局。 问题: 我正在努力
我有 Auto Complete Mode为 Emacs 安装。 首先:当我输入声明时,我会得到正常的自动完成行为: 所以我点击了 Tab 来完成——没问题。但后来我点击了 ;: 它会立即尝试完成某些
如您所见,我想将搜索栏恰好放在 safeArea 的顶部,但是 proxy.safeAreaInsets 没有正确的值,因为在PreviewProvider 父级使用 edgesIgnoringSaf
将应用沙盒化后,如何使用“从登录时开始”功能制作应用? 最佳答案 谢谢CORY BOHON,他创建了以下教程: http://martiancraft.com/blog/2015/01/login-i
我是一名优秀的程序员,十分优秀!