- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您可以将此视为我之前帖子的后续问题。
我已经编写了一个逻辑,只要它隐藏在键盘后面,我就可以向上移动文本字段。截至目前,我正在考虑键盘将覆盖所有设备底部 40% 的屏幕,因此根据设备大小移动文本字段。这当然是一个错误的假设,我需要先尝试计算键盘高度,然后再应用逻辑。
我对堆栈溢出的研究表明我可以通过 Notification 计算键盘高度。
虽然我按照堆栈溢出的指令编写了键盘高度的逻辑,但我不知道如何将我的通知代码和 textFieldDidBeginEditing 合并在一起以使其运行。
有没有人可以帮我解决这个问题?总之,我想在 textFieldDidBeginEditing 函数中使用键盘高度来使其动态化。
下面是我到目前为止写的一段代码:
键盘高度:
func keyboardHeightNotification(){
NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil
)
}
@objc func keyboardWillShow(_ notification: Notification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue {
let keyboardRectangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardRectangle.height
print(keyboardHeight)
}
}
向上移动文本字段代码(它工作正常但我需要合并键盘高度以使其动态化):
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField.frame.maxY > self.view.frame.height * 0.6
{
self.scrollView.setContentOffset(CGPoint.init(x: 0, y: textField.frame.maxY - self.view.frame.height * 0.6 + 2.0), animated: true)
}
else{
return
}
print(textField.frame.maxY)
print(self.view.frame.height * 0.6)
print(textField.frame.maxY - self.view.frame.height * 0.6)
}
func textFieldDidEndEditing(_ textField: UITextField)
{
self.scrollView.setContentOffset(CGPoint.init(x: 0, y: 0), animated: true)
self.view.endEditing(true);
}
更新了代码但仍然报错:
class StudentSignUpViewController: UIViewController,UIScrollViewDelegate, UITextFieldDelegate {
@IBOutlet weak var yourEmail: UITextField!
@IBOutlet weak var yourPassword: UITextField!
@IBOutlet weak var joinUsButton: UIButton!
@IBOutlet weak var back2SignInPage: UIButton!
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
//setting portrait
AppUtility.lockOrientation(.portrait)
//hide keyboard when click outside
self.hideKeyboardWhenTappedAround()
//hide keyboard when click on return
self.yourEmail.delegate = self
self.yourPassword.delegate = self
self.scrollView.delegate = self
//boarder line for nameText
//boarder line for yourEmail
yourEmail.frame.size.height = UIScreen.main.fixedCoordinateSpace.bounds.size.width * CGFloat(0.05)
yourEmail.font = UIFont.italicSystemFont(ofSize: UIScreen.main.fixedCoordinateSpace.bounds.size.width * CGFloat(0.04))
bottomBoader(BottomLine: "UrEmailTextBottomLine", length: 1.0, yourTextBox: yourEmail)
yourEmail.applyCustomClearButton(yourTextBox: yourEmail)
//boarder line for yourPassword
yourPassword.frame.size.height = UIScreen.main.fixedCoordinateSpace.bounds.size.width * CGFloat(0.05)
yourPassword.font = UIFont.italicSystemFont(ofSize: UIScreen.main.fixedCoordinateSpace.bounds.size.width * CGFloat(0.04))
bottomBoader(BottomLine: "UrPasswordTextBottomLine", length: 1.0, yourTextBox: yourPassword)
yourPassword.applyCustomClearButton(yourTextBox: yourPassword)
joinUsButton.layer.cornerRadius = joinUsButton.frame.height * 0.15
back2SignInPage.titleLabel?.font = UIFont.systemFont(ofSize: UIScreen.main.fixedCoordinateSpace.bounds.size.width * CGFloat(0.03))
keyboardHeightNotification()
//textFieldDidBeginEditing(yourPassword)
textFieldDidEndEditing(yourPassword)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
keyboardHeightNotification()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
AppUtility.lockOrientation(.portrait)
keyboardHeightNotification()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
AppUtility.lockOrientation(.all)
}
// ********************************** move text up when keyboard present ****************************************
var kbHeight: CGFloat?
func keyboardHeightNotification(){
NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil
)
}
@objc func keyboardWillShow(notification: NSNotification) {
if let userInfo = notification.userInfo {
if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
kbHeight = keyboardSize.height
}
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField.frame.maxY > kbHeight!
{
self.scrollView.setContentOffset(CGPoint.init(x: 0, y: textField.frame.maxY - (kbHeight! + 2.0)), animated: true)
}
else{
return
}
print(textField.frame.maxY)
print(self.view.frame.height * 0.6)
print(textField.frame.maxY - self.view.frame.height * 0.6)
}
}
}
func textFieldDidEndEditing(_ textField: UITextField)
{
self.scrollView.setContentOffset(CGPoint.init(x: 0, y: 0), animated: true)
self.view.endEditing(true);
}
}
最佳答案
您可以为此使用第 3 方库,我经常使用它,称为 Typist
link使用起来真的很简单,你可以得到很多关于键盘的信息
要像这样使用框架:
func startKeyboardListener() {
键盘
.on(event: .didShow) { [weak self] (options) in
self.setPosition(for:options.endFrame.origin.y)
}
。开始()
}
options.endFrame
是您想要的键盘框架。那里有很多更有用的信息
关于ios - 如何计算和使用 "textFieldDidBeginEditing"中的键盘高度(快速),以便我可以精确地将 UITextfield 向上移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47378057/
我正在开发一个应用程序,我在其中为应用程序的每个功能创建了模块。我必须从一个模块 UI Controller 切换到另一个模块 UI Controller 。 我在模块中有 UIController,
我的头文件 MyClass.h @interface MyClass : UIViewController { } @property (retain, nonatomic) IBOutlet UIT
当我使用这个方法时 -(void)textFieldDidBeginEditing:(UITextField *)textField 它给我一个错误 使用未声明的标识符“textFieldDidBeg
我有一个应用程序,在显示键盘的情况下我必须向上滚动。为了获得键盘大小,我正在注册 UIKeyboardWillShowNotification 事件,如下所示: [[NSNotification
我有一个 UIView,它包含另一个名为 contentView 的 UIView 对象。在 contentView 中,我有几个 UITextField 对象。为了使当前编辑的 UITextFiel
我在静态单元格 tableView 上有一个名为 textField 的 UItextField。该字段包含货币金额 - 例如“$10,000.00”。 编辑该金额时,货币和千位分组符号有点碍事。因此
我有一个包含三个 View 的项目,它们都是多个文本字段,在点击时调用 UIPickerView。我有两个 View 工作得很好,但是当我开始第三个 View 时,我无法调用 textFieldDid
我从 this 得到了下面的代码所以问题。当我开始编辑时,我试图向上滑动文本字段(因为否则它们会被 iPhone 键盘覆盖)。但是,日志语句显示未调用 textFieldDidBeginEditing
我有一个简单的 UITableViewController,它有 6 行,每行都有一个 UITextField。我希望能够单击每一行并将键盘应用于每一行。一切正常,除了出于某种原因我必须在每一行上单击
textFieldDidBeginEditing 和 textFieldShouldBeginEditing 之间的确切区别是什么。我想知道我们在哪种情况下使用它们(我知道当我们在文本字段中输入任何内
我在我的应用程序中使用 -(void)textFieldDidBeginEditing:(UITextField *)sender 这个函数。当我选择文本字段时,不会调用此函数。这是代码... -(v
如何将方法 textFieldDidBeginEditing 和 textFieldDidEndEditing 与苹果默认的 TextField 结构一起使用。 最佳答案 TextField 具有 o
我有动态tableView .几个单元格有 textField . UITextField *textField = [[UITextField alloc] initWithFrame:CGRect
我有一个复杂的问题,我正在解决越来越多的问题 :-) 我有一个嵌入式表格 View 。如果表格更改为编辑模式并且应编辑屏幕底部的某些文本字段,则它们隐藏在键盘后面。 我现在子类化了 UITableVi
这是我的代码: 在.h文件中 @interface VTViewController : UIViewController 在.m文件中 - (void)viewDidLoad { [sup
[myTextField becomeFirstResponder]; [myTextField resignFirstResonder]; 当我这样做 -(BOOL)textFieldShouldR
我将 UITextField 放在 UITableViewCell 中,并希望突出显示 tableViewCell 并且未选择的 tableViewCell 变为原始颜色,如果用户在每个 UIText
您可以将此视为我之前帖子的后续问题。 我已经编写了一个逻辑,只要它隐藏在键盘后面,我就可以向上移动文本字段。截至目前,我正在考虑键盘将覆盖所有设备底部 40% 的屏幕,因此根据设备大小移动文本字段。这
使用 UITextFieldDelegate,我根据 3 个 UITextFields 是否包含信息来禁用我的 UIButton“btnSignup”。目前,它的工作正常减去 UIButton rea
我制作了一个 Collection View ,其中填充了文本字段。我已经让 textFieldDidBeginEditing 正常工作了。我已将单元格中的文本字段分配给索引路径中的项目作为委托(de
我是一名优秀的程序员,十分优秀!