我正在尝试为iPhone构建输入屏幕.屏幕有许多输入字段.其中大多数位于屏幕顶部,但两个字段位于底部.当用户尝试编辑屏幕底部的文本时,键盘将弹出并覆盖屏幕.我找到了一个简单的解决方案,可以在发生这种情况时将屏幕向上移动,但结果是屏幕总是向上移动,当用户尝试编辑屏幕时,屏幕顶部的字段会移动.
有没有办法让屏幕只在编辑底部字段时移动?
我使用了这里找到的代码:
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Run Code Online (Sandbox Code Playgroud) 我的代码遇到了问题.我正在尝试移动UIScrollView当我正在编辑时UITextField应该被键盘弹出隐藏.
我现在正在移动主框架,因为我不知道如何在代码中"向上滚动".所以,我做了一些代码,它工作正常但是当我编辑一个UItextfield并且我切换到另一个UITextField而没有按下"返回"按钮时,主视图变得非常了不起.
我NSLog()用变量大小,距离和textFieldRect.origin.y 做了一个,如下所示.当我把两个UITextField放在同一个地方(y原点)并且我做这个特别的'开关'(没有按回车)时,我得到相同的数字,而我的代码在第一次UITextField编辑时工作正常但不适用于第二次编辑.
看一下这个:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
{
int size;
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
size = textFieldRect.origin.y + textFieldRect.size.height;
if (change == FALSE)
{
size = size - distance;
}
if (size < PORTRAIT_KEYBOARD_HEIGHT)
{
distance = 0;
}
else if (size > PORTRAIT_KEYBOARD_HEIGHT)
{
distance = size - PORTRAIT_KEYBOARD_HEIGHT + 5; // +5 px for more visibility
}
NSLog(@"origin %f", textFieldRect.origin.y);
NSLog(@"size %d", …Run Code Online (Sandbox Code Playgroud) 我有UITableView一个UITextField在每个UITableViewCells.我在我的ViewController中有一个方法,它处理每个单元格的文本字段的"Do End On Exit"事件,我想要做的是用新文本更新我的模型数据.
我现在拥有的是:
- (IBAction)itemFinishedEditing:(id)sender {
[sender resignFirstResponder];
UITextField *field = sender;
UITableViewCell *cell = (UITableViewCell *) field.superview.superview.superview;
NSIndexPath *indexPath = [_tableView indexPathForCell:cell];
_list.items[indexPath.row] = field.text;
}
Run Code Online (Sandbox Code Playgroud)
当然做起field.superview.superview.superview作用,但它似乎是如此hacky.有更优雅的方式吗?如果我设置的标签UITextField到indexPath.row其在细胞中的cellForRowAtIndexPath意志标签总是甚至插入和删除行后是正确的?
对于那些密切关注的人,你可能会认为我有一个.superview太多,而对于iOS6,你是对的.但是,在iOS7中,在单元格的内容视图和单元格本身之间的层次结构中有一个额外的视图(NDA阻止我形成详细说明).这恰恰说明了为什么做superview的事情有点hacky,因为它取决于知道如何UITableViewCell实现,并且可以打破操作系统的更新.
我有一个带有UITableview和UITextView的应用程序,所以有时候键盘会启动.键盘启动时,我无法访问底部的3-4个表格单元格,因为它们总是卡在键盘后面.如何在显示键盘时使UITableView占用键盘上方的空间?

因此,我正在构建一个详细视图控制器应用程序,它提供一个包含两部分单元格的表格:标签和文本字段.
我正在尝试检索文本字段值并将其添加到数组中.我尝试使用" textField.superview.superview"技术,但它没有奏效.
func textFieldDidEndEditing(textField: UITextField!){
var cell: UITableViewCell = textField.superview.superview
var table: UITableView = cell.superview.superview
let textFieldIndexPath = table.indexPathForCell(cell)
}
Run Code Online (Sandbox Code Playgroud)
Xcode无法构建并呈现" UIView不可转换为UITableViewCell"和"转换UITableView".引用表有两个部分,分别为四行和两行.
提前致谢.
编辑:在函数的第二行添加".superview".
我有一个UITableViewController有很多单元格,每个单元格包含四个相互垂直的文本字段,通过点击任何文本字段显示一个弹出窗口,但是,这个弹出窗口包含一个文本字段,当点击键盘被触发时,很可能是pop over将向上移动以防止键盘隐藏其文本字段(这是弹出窗口的默认行为),但在后台(灰色视图)中,tableViewController丢失其正确的滚动行为以保持弹出文件呈现 - textField键盘可见时在轨道上..
一个示例项目可以在这里下载.
在这种情况下,如何在键盘可见的情况下,如何偏移表视图以保持pop-presentFieldField在屏幕上显示?
我尝试了着名的TPKeyboardAvoiding图书馆,但没有解决问题.
ps tableViewController适用于前3或4个键盘发射,但在以后的尝试中会丢失精确的滚动.
屏幕截图(绿色文本字段是显示弹出窗口的文本字段,但tableViewController滚动到以红色显示的错误文本字段):

任何帮助将受到高度赞赏.
编辑:
这个问题不重复:选择文本字段时创建一个UITableView滚动,
因为我需要滚动到表视图的文本字段是一个不是键盘而scrollToRowAtIndexPath不是键盘弹出的文本字段这种情况因为每个单元格包含4个文本字段.
可能重复:
UITableView和键盘滚动问题
我有一个屏幕,其中有几个文本字段(UITextField)用于从用户收集信息,最终占用了大部分屏幕.当用户选择一个字段时,软键盘会出现(如预期的那样),但它会掩盖屏幕下方显示的字段.为了到达那些字段,用户必须关闭键盘并选择它们,并且在这样做时,该字段再次被掩盖并且用户无法看到他们正在键入的内容.
我尝试将文本字段包装成a UIScrollView,希望当键盘占用屏幕上的空间时,我可以将屏幕的uppper部分向下滚动到其他文本字段,但这不起作用.
我希望得到这种滚动行为.有谁知道怎么做?
-TIA
我有一个全屏 UITableView,它固定在顶部、底部、尾随和前导。此 ViewController 位于导航控制器内。我希望桌子的底部向上移动并在出现时使用键盘设置动画。我有以下代码:
// MARK: Keyboard
func registerObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func unregisterObservers() {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func keyboardWillShow(_ notification: Notification) {
let keyboardFrame = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
let keyboardAnimationDuration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
let keyboardAnimationCurve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber
tableViewBottomConstraint.constant = keyboardFrame.height
UIView.animate(withDuration: TimeInterval(keyboardAnimationDuration), delay: 0, options: [UIViewAnimationOptions(rawValue: UInt(keyboardAnimationCurve))], animations: {
self.view.layoutIfNeeded()
}, completion: { (finished: Bool) …Run Code Online (Sandbox Code Playgroud) 我有一个包含可变数量的部分和自定义单元格的表视图.在某些情况下,单元格可能会在RowSelected()内调整大小.每当发生这种情况时,我还要确保在调整大小(放大)后单元格完全可见.
我在另一个表中工作,只是修改基础数据,以便表视图源将提供更大的单元格.然后我重新加载单元格并将其滚动显示如下:
// Modify data
//...
// Reload cell
tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.None);
tableView.ScrollRectToVisible(tableView.CellAt(indexPath).Frame, true);
Run Code Online (Sandbox Code Playgroud)
问题出现在表视图中,其中调整大小不仅可以由RowSelected()触发,还可以由单元格内的UI元素上的事件触发.
然后事件调用一个方法来重新加载单元格:
void updateCell() {
if (cell.Superview != null) {
UITableView tableView = (UITableView)cell.Superview;
tableView.ReloadRows(new NSIndexPath[] { indexPath }, UITableViewRowAnimation.None);
// Get the new (possibly enlarged) frame
RectangleF frame = tableView.CellAt(indexPath).Frame;
Console.WriteLine("This really is the new large frame, height: {0}", frame.Height);
// Try to scroll it visible
tableView.ScrollRectToVisible(frame, true);
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于所有细胞,但最底部.它只会使该单元格的旧框架可见.我仔细检查它确实为ScrollRectToVisible()提供了新的单元格框架.
因此,似乎ScrollRectToVisible()绑定到表的旧内容大小 - 即使在重新加载行之后也是如此.我尝试通过提供新的内容大小和计算出的高度差来解决这个问题.这确实有效,但对我来说真的很烦人.
有一些更干净的方式做事吗?
提前致谢
我正在尝试找到一种方法来避免键盘不阻止动态 UITableViews 中选定的 UITextField。
我知道这是一个常见问题,对此有很多答案。然而,我找到的答案要么在 Obj-C 中,要么不涉及动态 UITableView。
我的表格视图有自己的 UITableViewCell,因此 UITextFields 连接到它。
另外,我想在输入 UITextField 后刷新单元格。我可以将该信息(我猜测单元格的 IndexPath.row?)传递给 UIViewController 并让它监听更改并应用重新加载单元格方法?
这是我的相关代码:
class favCell: UITableViewCell, UITextFieldDelegate {
@IBOutlet weak var deciPadField: UITextField!
@objc func doneClicked(){
updateTotalWorth()
deciPadField.resignFirstResponder()
deciPadField.endEditing(true)
}
func textFieldDidBeginEditing(_ textField: UITextField) {
deciPadField.becomeFirstResponder()
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let currentString: NSString = (textField.text ?? "") as NSString
let newString = currentString.replacingCharacters(in: range, with: string)
return newString.count <= 10
}
func textFieldShouldReturn(_ textField: …Run Code Online (Sandbox Code Playgroud) ios ×9
uitableview ×7
iphone ×3
objective-c ×3
swift ×3
cocoa-touch ×2
keyboard ×2
arrays ×1
scroll ×1
scrollview ×1
uitextfield ×1
xamarin.ios ×1
xcode6 ×1