Metin alanı seçildiğinde UITableView kaydırma yapma

oy
228

deneme yanılma bir sürü sonra vazgeçerek ve soru soruyorum. Ben benzer sorunları olan bir sürü insan gördüm ama tüm cevaplar doğru çalışması için alınamıyor.

Bir var UITableViewözel hücrelerden oluşur ki. Hücreleri (bir çeşit ızgara gibi) yanyana 5 metin alanlarının yapılır.

Ben kaydırmak ve altındaki hücreleri düzenlemek çalıştığınızda UITableView, benim hücrelerin düzgün klavyenin üstünde konumlandırılmış almak yönetemez.

Ben vb değişen görünüm boyutları, söz birçok cevapları gördük ... ama bunların hiçbiri bugüne kadar güzel çalıştı.

Herkes somut kod örneği ile bunu yapmak için doğru yolu açıklayabilir misiniz?

Oluştur 27/02/2009 saat 11:05
kaynak kullanıcı
Diğer dillerde...                            


48 cevaplar

oy
110

yerine UIViewController UITableViewController kullanmak, otomatik olarak yapacaktır.

Cevap 21/09/2010 saat 04:42
kaynak kullanıcı

oy
89

kaydırmayı yapar işlevi çok daha basit olabilir:

- (void) textFieldDidBeginEditing:(UITextField *)textField {
    UITableViewCell *cell;

    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
    // Load resources for iOS 6.1 or earlier
        cell = (UITableViewCell *) textField.superview.superview;

    } else {
        // Load resources for iOS 7 or later
        cell = (UITableViewCell *) textField.superview.superview.superview; 
       // TextField -> UITableVieCellContentView -> (in iOS 7!)ScrollView -> Cell!
    }
    [tView scrollToRowAtIndexPath:[tView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

Bu kadar. Hiç hiçbir hesaplamaları.

Cevap 15/04/2009 saat 13:21
kaynak kullanıcı

oy
65

Bunun bildik! Çok benzer bir şey yapıyorum, gerek kodunuz için belirli bir şey hesaplamak için. Sadece kod üzerinde açıklamalar kontrol edin:

MyUIViewController.h yılında

@interface MyUIViewController: UIViewController <UITableViewDelegate, UITableViewDataSource>
{
     UITableView *myTableView;
     UITextField *actifText;
}

@property (nonatomic, retain) IBOutlet UITableView *myTableView;
@property (nonatomic, retain) IBOutlet UITextField *actifText;

- (IBAction)textFieldDidBeginEditing:(UITextField *)textField;
- (IBAction)textFieldDidEndEditing:(UITextField *)textField;

-(void) keyboardWillHide:(NSNotification *)note;
-(void) keyboardWillShow:(NSNotification *)note;

@end

MyUIViewController.m olarak

@implementation MyUIViewController

@synthesize myTableView;
@synthesize actifText;

- (void)viewDidLoad 
{
    // Register notification when the keyboard will be show
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(keyboardWillShow:)
                                          name:UIKeyboardWillShowNotification
                                          object:nil];

    // Register notification when the keyboard will be hide
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(keyboardWillHide:)
                                          name:UIKeyboardWillHideNotification
                                          object:nil];
}

// To be link with your TextField event "Editing Did Begin"
//  memoryze the current TextField
- (IBAction)textFieldDidBeginEditing:(UITextField *)textField
{
    self.actifText = textField;
}

// To be link with your TextField event "Editing Did End"
//  release current TextField
- (IBAction)textFieldDidEndEditing:(UITextField *)textField
{
    self.actifText = nil;
}

-(void) keyboardWillShow:(NSNotification *)note
{
    // Get the keyboard size
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];

    // Detect orientation
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect frame = self.myTableView.frame;

    // Start animation
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];

    // Reduce size of the Table view 
    if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
        frame.size.height -= keyboardBounds.size.height;
    else 
        frame.size.height -= keyboardBounds.size.width;

    // Apply new size of table view
    self.myTableView.frame = frame;

    // Scroll the table view to see the TextField just above the keyboard
    if (self.actifText)
      {
        CGRect textFieldRect = [self.myTableView convertRect:self.actifText.bounds fromView:self.actifText];
        [self.myTableView scrollRectToVisible:textFieldRect animated:NO];
      }

    [UIView commitAnimations];
}

-(void) keyboardWillHide:(NSNotification *)note
{
    // Get the keyboard size
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];

    // Detect orientation
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect frame = self.myTableView.frame;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];

    // Increase size of the Table view 
    if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
        frame.size.height += keyboardBounds.size.height;
    else 
        frame.size.height += keyboardBounds.size.width;

    // Apply new size of table view
    self.myTableView.frame = frame;

    [UIView commitAnimations];
}

@end

Swift 1.2 ve üzeri versiyon:

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var activeText: UITextField!
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: Selector("keyboardWillShow:"),
            name: UIKeyboardWillShowNotification,
            object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: Selector("keyboardWillHide:"),
            name: UIKeyboardWillHideNotification,
            object: nil)
    }

    func textFieldDidBeginEditing(textField: UITextField) {
        activeText = textField
    }

    func textFieldDidEndEditing(textField: UITextField) {
        activeText = nil
    }

    func keyboardWillShow(note: NSNotification) {
        if let keyboardSize = (note.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            var frame = tableView.frame
            UIView.beginAnimations(nil, context: nil)
            UIView.setAnimationBeginsFromCurrentState(true)
            UIView.setAnimationDuration(0.3)
            frame.size.height -= keyboardSize.height
            tableView.frame = frame
            if activeText != nil {
                let rect = tableView.convertRect(activeText.bounds, fromView: activeText)
                tableView.scrollRectToVisible(rect, animated: false)
            }
            UIView.commitAnimations()
        }
    }

    func keyboardWillHide(note: NSNotification) {
        if let keyboardSize = (note.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            var frame = tableView.frame
            UIView.beginAnimations(nil, context: nil)
            UIView.setAnimationBeginsFromCurrentState(true)
            UIView.setAnimationDuration(0.3)
            frame.size.height += keyboardSize.height
            tableView.frame = frame
            UIView.commitAnimations()
        }
    }
}
Cevap 13/04/2010 saat 15:46
kaynak kullanıcı

oy
41

Ben aynı problem vardı ama sadece tek bir görünümde göründüğünü fark etti. Bu yüzden kontrolörler farklılıklar aramaya başladı.

Ben kaydırma davranışı ayarlanır öğrendim - (void)viewWillAppear:(BOOL)animatedsüper örneğinin.

Yani böyle uygulamak emin olun:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // your code
}

Kullanmak Ve o önemli değil UIViewControllerya UITableViewController; Bir koyarak kontrol UITableViewiçinde self.view bir subview UIViewController. Aynı davranış oldu. Görünüm çağrı eğer kaydırmak için izin vermedi [super viewWillAppear:animated];eksikti.

Cevap 29/05/2011 saat 01:42
kaynak kullanıcı

oy
37

i burada bütün yazı okumadım olarak, bu cevapsız, ama ne ben ile geldi aldatıcı basit görünüyor olabilir. Ben her durumda test atlatmak koymak değil, ama bu sadece iyi çalışması gerekir gibi görünüyor.

basitçe klavyenin yüksekliği ile tableview contentInset ayarlamak ve sonra dibe hücreyi kaydırma:

- (void)keyboardWasShown:(NSNotification *)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    self.myTableView.contentInset = contentInsets;
    self.myTableView.scrollIndicatorInsets = contentInsets;

    [self.myTableView scrollToRowAtIndexPath:self.currentField.indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

ve tabi ki

- (void)keyboardWasHidden:(NSNotification *)aNotification
{
    [UIView animateWithDuration:.3 animations:^(void) 
    {
        self.myTableView.contentInset = UIEdgeInsetsZero;
        self.myTableView.scrollIndicatorInsets = UIEdgeInsetsZero;
    }];
}

Bu çok basit? Bir şey eksik? Şimdiye kadar ince benim için çalışıyor, ama dediğim gibi, ben merdane ile almadığım ...

Cevap 18/08/2012 saat 01:12
kaynak kullanıcı

oy
35

Için en basit çözüm Swift 3 göre, Bartłomiej Semańczyk çözeltisi :

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(CreateEditRitualViewController.keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(CreateEditRitualViewController.keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

// MARK: Keyboard Notifications

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
        tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    UIView.animate(withDuration: 0.2, animations: {
        // For some reason adding inset in keyboardWillShow is animated by itself but removing is not, that's why we have to use animateWithDuration here
        self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
    })
}
Cevap 08/12/2016 saat 13:26
kaynak kullanıcı

oy
34

Eğer kullanabiliyorsanız UITableViewController, ücretsiz olarak işlevsellik olsun. Ancak bazen, bu birden fazla görünüm sadece ihtiyaç özellikle eğer bir seçenek değildir UITableView.

Burada sunulan çözümlerden bazıları, ≥4 iOS'ta işe yaramayan bazı (biz herhangi kaydırma istemiyoruz olduğu) bazı Bluetooth klavyeler için çalışmaz, iPad'de veya yatay modda çalışmaz, bazı yoktur birden fazla metin alanı arasında geçiş yaparken çalışır. Eğer herhangi bir çözüm tercih Yani, bu durumlarda test etmek için emin olun. Bu, çözüm kullanın kullanıldığı içinde InAppSettingsKit :

- (void)_keyboardWillShow:(NSNotification*)notification {
    if (self.navigationController.topViewController == self) {
        NSDictionary* userInfo = [notification userInfo];

        // we don't use SDK constants here to be universally compatible with all SDKs ≥ 3.0
        NSValue* keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardBoundsUserInfoKey"];
        if (!keyboardFrameValue) {
            keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardFrameEndUserInfoKey"];
        }

        // Reduce the tableView height by the part of the keyboard that actually covers the tableView
        CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
        if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
            windowRect = IASKCGRectSwap(windowRect);
        }
        CGRect viewRectAbsolute = [_tableView convertRect:_tableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
        if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
            viewRectAbsolute = IASKCGRectSwap(viewRectAbsolute);
        }
        CGRect frame = _tableView.frame;
        frame.size.height -= [keyboardFrameValue CGRectValue].size.height - CGRectGetMaxY(windowRect) + CGRectGetMaxY(viewRectAbsolute);

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
        [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
        _tableView.frame = frame;
        [UIView commitAnimations];

        UITableViewCell *textFieldCell = (id)((UITextField *)self.currentFirstResponder).superview.superview;
        NSIndexPath *textFieldIndexPath = [_tableView indexPathForCell:textFieldCell];

        // iOS 3 sends hide and show notifications right after each other
        // when switching between textFields, so cancel -scrollToOldPosition requests
        [NSObject cancelPreviousPerformRequestsWithTarget:self];

        [_tableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }
}

- (void) scrollToOldPosition {
  [_tableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)_keyboardWillHide:(NSNotification*)notification {
    if (self.navigationController.topViewController == self) {
        NSDictionary* userInfo = [notification userInfo];

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
        [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
        _tableView.frame = self.view.bounds;
        [UIView commitAnimations];

        [self performSelector:@selector(scrollToOldPosition) withObject:nil afterDelay:0.1];
    }
}   

İşte sınıfın tam kodu InAppSettingsKit içinde. Bunu test etmek için, yukarıda belirtilen senaryoları test edebilirsiniz "Tüm Liste" çocuk bölmesini kullanın.

Cevap 13/12/2010 saat 17:01
kaynak kullanıcı

oy
34

Ben Apple'ın uygulamaların çalışmasını eşleştirmek için çözüm ile geldim düşünüyorum.

Öncelikle, viewWillAppear içinde: Klavye göstermek ve gizlemek ve sistem size klavyenin boyutunu anlatmak, ama dont' sizin viewWillDisappear içinde kaydını silmek unutacak ne zaman bilmeleri, klavye bildirimlerine abone :.

[[NSNotificationCenter defaultCenter]
    addObserver:self
       selector:@selector(keyboardWillShow:)
           name:UIKeyboardWillShowNotification
         object:nil];
[[NSNotificationCenter defaultCenter]
    addObserver:self
       selector:@selector(keyboardWillHide:)
           name:UIKeyboardWillHideNotification
         object:nil];

Klavye gösterileri kez görünür alandan uygun zaman tableView boyutunu ayarlamak böylece aşağıda benzer yöntemler uygulamak. geri tam yüksekliğe kendim tableView ayarlamak için zaman her alan değişikliği bu bildirimleri almak beri, seçebilmesi Burada ayrı ayrı klavyenin durumunu takip ediyorum. keyboardWillHide uygulamak unutmayın: bir yerlerinde tableView boyutunu düzeltmek için uygun seçin.

-(void) keyboardWillShow:(NSNotification *)note
{
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &keyboardBounds];
    keyboardHeight = keyboardBounds.size.height;
    if (keyboardIsShowing == NO)
    {
        keyboardIsShowing = YES;
        CGRect frame = self.view.frame;
        frame.size.height -= keyboardHeight;

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:0.3f];
        self.view.frame = frame;
        [UIView commitAnimations];
    }
}

Şimdi burada kaydırma biraz yukarıda veya esaslı metin alanının ortasında aşağıda yarısı görünümü ya olmaya biz görünür bölgede nerede o gördüğümüz ilk birkaç boyutları çalışmak ve biz ilerleyin istiyoruz rect ayarlayın bulunuyor o görünümde olduğu üzerinde. Bu durumda, biz UITextFields dizisi ve bunların izler Bir enum, böylece satır sayısına göre rowHeight çarparak bize bu dış görünümü içinde çerçevenin ofset fiili verir var.

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame = textField.frame;
    CGFloat rowHeight = self.tableView.rowHeight;
    if (textField == textFields[CELL_FIELD_ONE])
    {
        frame.origin.y += rowHeight * CELL_FIELD_ONE;
    }
    else if (textField == textFields[CELL_FIELD_TWO])
    {
        frame.origin.y += rowHeight * CELL_FIELD_TWO;
    }
    else if (textField == textFields[CELL_FIELD_THREE])
    {
        frame.origin.y += rowHeight * CELL_FIELD_THREE;
    }
    else if (textField == textFields[CELL_FIELD_FOUR])
    {
        frame.origin.y += rowHeight * CELL_FIELD_FOUR;
    }
    CGFloat viewHeight = self.tableView.frame.size.height;
    CGFloat halfHeight = viewHeight / 2;
    CGFloat midpoint = frame.origin.y + (textField.frame.size.height / 2);
    if (midpoint < halfHeight)
    {
        frame.origin.y = 0;
        frame.size.height = midpoint;
    }
    else
    {
        frame.origin.y = midpoint;
        frame.size.height = midpoint;
    }
    [self.tableView scrollRectToVisible:frame animated:YES];
}

Bu oldukça güzel iş gibi görünüyor.

Cevap 23/03/2009 saat 02:49
kaynak kullanıcı

oy
22

Için en basit çözüm Swift :

override func viewDidLoad() {
    super.viewDidLoad()

    searchBar?.becomeFirstResponder()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.keyboardWillShow(_:)), name: UIKeyboardDidShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.keyboardWillHide(_:)), name: UIKeyboardDidHideNotification, object: nil)
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let keyboardHeight = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue.size.height {
            tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
        }
    }
}

func keyboardWillHide(notification: NSNotification) {
    UIView.animateWithDuration(0.2, animations: { self.table_create_issue.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) })
    // For some reason adding inset in keyboardWillShow is animated by itself but removing is not, that's why we have to use animateWithDuration here
    }
Cevap 25/08/2015 saat 06:42
kaynak kullanıcı

oy
6

Sizlerin zaten tüm bu okuma bir çözüm var umuyoruz. Şöyle Ama çözüm buldu. Ben zaten bir hücre olduğunu bekliyorum UITextField. Yani hazırlarken sadece metin alanının etikete satır dizini tutun.

cell.textField.tag = IndexPath.row;

Bir oluşturma activeTextField, örneğini UITextFieldaşağıda küresel kapsamı ile:

@interface EditViewController (){

    UITextField *activeTextField;

}

Yani artık sadece sonunda kodumu kopyalayıp yapıştırın. Ve ayrıca eklemeyi unutmayınUITextFieldDelegate

#pragma mark - TextField Delegation

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

    activeTextField = textField;

    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField{

    activeTextField = nil;

}

Registers klavye notifications

#pragma mark - Keyboard Activity

- (void)registerForKeyboardNotifications

{

    [[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(keyboardWasShown:)

                                             name:UIKeyboardDidShowNotification object:nil];



    [[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(keyboardWillBeHidden:)

                                             name:UIKeyboardWillHideNotification object:nil];



}

Klavye Kolları Notifications:

Çağrıldı UIKeyboardDidShowNotificationgönderilir.

- (void)keyboardWasShown:(NSNotification*)aNotification

{

    NSDictionary* info = [aNotification userInfo];

    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);

    [self.tableView setContentInset:contentInsets];

    [self.tableView setScrollIndicatorInsets:contentInsets];

    NSIndexPath *currentRowIndex = [NSIndexPath indexPathForRow:activeTextField.tag inSection:0];

    [self.tableView scrollToRowAtIndexPath:currentRowIndex atScrollPosition:UITableViewScrollPositionTop animated:YES];

}

Çağrılan UIKeyboardWillHideNotificationgönderilir

- (void)keyboardWillBeHidden:(NSNotification*)aNotification

{

    UIEdgeInsets contentInsets = UIEdgeInsetsZero;

    [self.tableView setContentInset:contentInsets];

    [self.tableView setScrollIndicatorInsets:contentInsets];

}

Şimdi bir şey bırakılır, Çağrı registerForKeyboardNotificationsgiriş yöntemini ViewDidLoadşöyle yöntemle:

- (void)viewDidLoad {

    [super viewDidLoad];

    // Registering keyboard notification

    [self registerForKeyboardNotifications];

    // Your codes here...

}

Sen, bitmiş senin umut olan textFieldsirade artık klavye tarafından gizli.

Cevap 03/01/2015 saat 21:36
kaynak kullanıcı

oy
6

Birleştiren ve başka yazı, bu Dikey veya Yatay modunda bir iPad'de SDK 4.3 için kutunun dışında çalışacaktır (özellikle Ortwin Gentz, kullanıcı 98013 olarak) birkaç yanıtlarından boşlukları doldurma:

@implementation UIView (FindFirstResponder)
- (UIResponder *)findFirstResponder
{
  if (self.isFirstResponder) {        
    return self;     
  }

  for (UIView *subView in self.subviews) {
    UIResponder *firstResponder = [subView findFirstResponder];
    if (firstResponder != nil) {
      return firstResponder;
    }
  }

  return nil;
}
@end

@implementation MyViewController

- (UIResponder *)currentFirstResponder {
  return [self.view findFirstResponder];
}

- (IBAction)editingEnded:sender {
  [sender resignFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
  [textField resignFirstResponder];
  return NO;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
  UITableViewCell *cell = (UITableViewCell*) [[textField superview] superview];
  [_tableView scrollToRowAtIndexPath:[_tableView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)keyboardWillShow:(NSNotification*)notification {
  if ([self currentFirstResponder] != nil) {
    NSDictionary* userInfo = [notification userInfo];

    // we don't use SDK constants here to be universally compatible with all SDKs ≥ 3.0
    NSValue* keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardBoundsUserInfoKey"];
    if (!keyboardFrameValue) {
      keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardFrameEndUserInfoKey"];
    }

    // Reduce the tableView height by the part of the keyboard that actually covers the tableView
    CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
    CGRect viewRectAbsolute = [_tableView convertRect:_tableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
    CGRect frame = _tableView.frame;
    if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
      windowRect = CGRectMake(windowRect.origin.y, windowRect.origin.x, windowRect.size.height, windowRect.size.width);
      viewRectAbsolute = CGRectMake(viewRectAbsolute.origin.y, viewRectAbsolute.origin.x, viewRectAbsolute.size.height, viewRectAbsolute.size.width);
    }
    frame.size.height -= [keyboardFrameValue CGRectValue].size.height - CGRectGetMaxY(windowRect) + CGRectGetMaxY(viewRectAbsolute);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    _tableView.frame = frame;
    [UIView commitAnimations];

    UITableViewCell *textFieldCell = (id)((UITextField *)self.currentFirstResponder).superview.superview;
    NSIndexPath *textFieldIndexPath = [_tableView indexPathForCell:textFieldCell];

    // iOS 3 sends hide and show notifications right after each other
    // when switching between textFields, so cancel -scrollToOldPosition requests
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    _topmostRowBeforeKeyboardWasShown = [[_tableView indexPathsForVisibleRows] objectAtIndex:0];
    [_tableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
  }
}

- (void) scrollToOldPosition {
  [_tableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)keyboardWillHide:(NSNotification*)notification {
  if ([self currentFirstResponder] != nil) {

    NSDictionary* userInfo = [notification userInfo];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    _tableView.frame = self.view.bounds;
    [UIView commitAnimations];

    [self performSelector:@selector(scrollToOldPosition) withObject:nil afterDelay:0.1];
  }
}   

@end
Cevap 03/08/2011 saat 03:35
kaynak kullanıcı

oy
5

Benim yaklaşımım:

Ben ilk UITextField alt sınıf ve bir indexPath özelliğini ekleyin. cellFor ise ... Yöntem i indexPath özelliğini devredecek.

Sonra kod şunları ekleyin:

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:textField.indexPath];

CGPoint cellPoint = [cell convertPoint:textField.center toView:self.tableView];
[UIView animateWithDuration:0.3 animations:^(void){self.tableView.contentOffset = CGPointMake(0, cellPoint.y-50);}];

vb textFieldShould / WillBegin ... için.

Klavye kaybolduğunda sen onu ters vardır:

[UIView animateWithDuration:0.3 animations:^(void){self.tableView.contentOffset = CGPointMake(0, 0);}];
Cevap 29/09/2012 saat 13:03
kaynak kullanıcı

oy
4

Kullanım UITextField's delegateyöntemi:

hızlı

func textFieldShouldBeginEditing(textField: UITextField) -> bool {
  let txtFieldPosition = textField.convertPoint(textField.bounds.origin, toView: yourTableViewHere)
  let indexPath = yourTablViewHere.indexPathForRowAtPoint(txtFieldPosition)
  if indexPath != nil {
     yourTablViewHere.scrollToRowAtIndexPath(indexPath!, atScrollPosition: .Top, animated: true)
  }
  return true
}

Objective-C

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
  CGPoint txtFieldPosition = [textField convertPoint:CGPointZero toView: yourTablViewHere];
  NSLog(@"Begin txtFieldPosition : %@",NSStringFromCGPoint(txtFieldPosition));
  NSIndexPath *indexPath = [yourTablViewHere indexPathForRowAtPoint:txtFieldPosition];

  if (indexPath != nil) {
     [yourTablViewHere scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
  }
  return YES;
}
Cevap 20/03/2015 saat 07:00
kaynak kullanıcı

oy
4

SAĞ YANIT Sam Ho'nun cevabı:

"Yerine UIViewController UITableViewController kullanmak, otomatik olarak yaparız.".

Sadece UITableViewController TableView özelliği (örneğin yüzden UITableViewController Görüntüle özelliğinin bir subview eklemek gerekmez) için UITableView bağlandığından emin olun.

Ayrıca FlexibleHeight için UITableView AutoresizingMask özelliğini ayarlamak için emin olun

Cevap 09/12/2010 saat 11:28
kaynak kullanıcı

oy
4

Eğer kullanırsanız Three20, o zaman kullanmak autoresizesForKeyboardözelliğini. Sadece görünüm kontrolörün belirlenen -initWithNibName:bundleyönteme

self.autoresizesForKeyboard = YES

Bu ilgilenir:

  1. Klavye bildirimleri için dinleme ve masa görünümün çerçeveyi ayarlayarak
  2. İlk yanıtlayıcısına kaydırma

Bitti ve bitti.

Cevap 21/09/2010 saat 14:19
kaynak kullanıcı

oy
4

Klavye bildirimleri çalışır, ancak bunun için Apple'ın örnek kod kaydırma görünümü penceresinin kök görünümü olduğunu varsayar. Bu genellikle durum böyle değil. Sen ofset hakkını almak için, vb sekme çubukları, telafi etmek gerekir.

Sesler daha kolaydır. Burada bir UITableViewController kullanmak koddur. Bu iki örnek değişkene, hiddenRect ve keyboardShown vardır.

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification {
    if (keyboardShown)
        return;

    NSDictionary* info = [aNotification userInfo];

    // Get the frame of the keyboard.
    NSValue *centerValue = [info objectForKey:UIKeyboardCenterEndUserInfoKey];
    NSValue *boundsValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
    CGPoint keyboardCenter = [centerValue CGPointValue];
    CGRect keyboardBounds = [boundsValue CGRectValue];
    CGPoint keyboardOrigin = CGPointMake(keyboardCenter.x - keyboardBounds.size.width / 2.0,
                                         keyboardCenter.y - keyboardBounds.size.height / 2.0);
    CGRect keyboardScreenFrame = { keyboardOrigin, keyboardBounds.size };


    // Resize the scroll view.
    UIScrollView *scrollView = (UIScrollView *) self.tableView;
    CGRect viewFrame = scrollView.frame;
    CGRect keyboardFrame = [scrollView.superview convertRect:keyboardScreenFrame fromView:nil];
    hiddenRect = CGRectIntersection(viewFrame, keyboardFrame);

    CGRect remainder, slice;
    CGRectDivide(viewFrame, &slice, &remainder, CGRectGetHeight(hiddenRect), CGRectMaxYEdge);
    scrollView.frame = remainder;

    // Scroll the active text field into view.
    CGRect textFieldRect = [/* selected cell */ frame];
    [scrollView scrollRectToVisible:textFieldRect animated:YES];

    keyboardShown = YES;
}


// Called when the UIKeyboardDidHideNotification is sent
- (void)keyboardWasHidden:(NSNotification*)aNotification
{
    // Reset the height of the scroll view to its original value
    UIScrollView *scrollView = (UIScrollView *) self.tableView;
    CGRect viewFrame = [scrollView frame];
    scrollView.frame = CGRectUnion(viewFrame, hiddenRect);

    keyboardShown = NO;
}
Cevap 11/07/2009 saat 23:01
kaynak kullanıcı

oy
4

Eğer (senin textfields yerleştirmek için bir UITableView kullanırsanız Jeff Lamarche dan ), sadece şöyle temsilci yöntemi kullanarak tableView kaydırabilirsiniz.

(Not: benim metin alanları aynı endekse sahip bir dizi saklanır tableview orada satır gibi)

- (void) textFieldDidBeginEditing:(UITextField *)textField
    {

        int index;
        for(UITextField *aField in textFields){

            if (textField == aField){
                index = [textFields indexOfObject:aField]-1;
            }
        }

         if(index >= 0) 
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

        [super textFieldDidBeginEditing:textField];
    }
Cevap 01/05/2009 saat 07:09
kaynak kullanıcı

oy
3

Daha akış kaplı çözelti. Bu UITextField temsilci yöntemleri içine sığar, bu yüzden UIKeyboard bildirimleri w / karışıklık gerektirmez.

Uygulama notlar:

kSettingsRowHeight - bir UITableViewCell yüksekliği.

offsetTarget ve offsetThreshold kSettingsRowHeight kapalı baed edilir. Farklı bir satır yüksekliği kullanırsanız, noktanın y özelliğine bu değerleri ayarlayın. [Alt: farklı bir şekilde ofset satır hesaplar.]

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
CGFloat offsetTarget    = 113.0f; // 3rd row
CGFloat offsetThreshold = 248.0f; // 6th row (i.e. 2nd-to-last row)

CGPoint point = [self.tableView convertPoint:CGPointZero fromView:textField];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

CGRect frame = self.tableView.frame;
if (point.y > offsetThreshold) {
    self.tableView.frame = CGRectMake(0.0f,
                      offsetTarget - point.y + kSettingsRowHeight,
                      frame.size.width,
                      frame.size.height);
} else if (point.y > offsetTarget) {
    self.tableView.frame = CGRectMake(0.0f,
                      offsetTarget - point.y,
                      frame.size.width,
                      frame.size.height);
} else {
    self.tableView.frame = CGRectMake(0.0f,
                      0.0f,
                      frame.size.width,
                      frame.size.height);
}

[UIView commitAnimations];

return YES;

}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

CGRect frame = self.tableView.frame;
self.tableView.frame = CGRectMake(0.0f,
                  0.0f,
                  frame.size.width,
                  frame.size.height);

[UIView commitAnimations];

return YES;

}

Cevap 04/08/2009 saat 08:18
kaynak kullanıcı

oy
3

Senin sorunundan (ı birbiri üzerine yığılmış düzenlenebilir hücrelerin bir grup ile iPhone'un settings.app benzer bir ekran istedik) ve bu yaklaşımın iyi çalıştı bulundu gibi bir şey koştu:

önlemek için yaklaşık uitextfields kayar

Cevap 27/02/2009 saat 15:17
kaynak kullanıcı

oy
2

Metin alanın tam noktasını kullanarak Swift de bir örnek, Al indexPath Swift ile UITableViewCell içinde UITextField :

func textFieldDidBeginEditing(textField: UITextField) {
    let pointInTable = textField.convertPoint(textField.bounds.origin, toView: self.accountsTableView)
    let textFieldIndexPath = self.accountsTableView.indexPathForRowAtPoint(pointInTable)
    accountsTableView.scrollToRowAtIndexPath(textFieldIndexPath!, atScrollPosition: .Top, animated: true)
}
Cevap 21/05/2015 saat 06:34
kaynak kullanıcı

oy
2

Çok ilginç bir tartışma iplik, ben de aynı sorunu nedeniyle bir kötü olabilir karşılaştığı

  1. Özel bir hücreyi kullanıyordum ve textfield o içindeydi.
  2. Ben can UITableViewController yararlanmak yani benim gereksinimlerini karşılamak için UIViewController kullanmak zorunda kaldı.
  3. Masamın hücresinde filtre / sıralama kriterleri vardı, yani ur hücreleri değişen ve indexPath takip devam ediyor ve tüm yardımcı olmayacaktır.

Yani burada konuları okumak ve iPad benim içeriklerini yukarı iterek bana yardımcı oldu benim versiyonunu uygulamaya manzara modunda. İşte kod Öncelikle u düzenleme başlar özel hücre sınıfı, bir temsilci olması gerekir (bu ispatı ve tüm aptal değildir, ama benim sorun giderildikten) 'dir, ur viewcontroller textfield'ı gönderir ve orada activefield = theTextField set

SADECE PEYZAJ MODE delebilirsiniz UYGULANMADI //

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbValue = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect aRect = myTable.frame;

    CGSize kbSize = CGSizeMake(kbValue.height, kbValue.width);

    aRect.size.height -= kbSize.height+50;
// This will the exact rect in which your textfield is present
        CGRect rect =  [myTable convertRect:activeField.bounds fromView:activeField];
// Scroll up only if required
    if (!CGRectContainsPoint(aRect, rect.origin) ) {


            [myTable setContentOffset:CGPointMake(0.0, rect.origin.y) animated:YES];

    }


}

// UIKeyboardWillHideNotification gönderildiğinde Denilen

- (void)keyboardWillHide:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    myTable.contentInset = contentInsets;
    myTable.scrollIndicatorInsets = contentInsets;
    NSDictionary* info = [aNotification userInfo];
    CGSize kbValue = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGSize kbSize = CGSizeMake(kbValue.height, kbValue.width);
    CGRect bkgndRect = activeField.superview.frame;
    bkgndRect.size.height += kbSize.height;
    [activeField.superview setFrame:bkgndRect];
    [myTable setContentOffset:CGPointMake(0.0, 10.0) animated:YES];
}

-anoop4real

Cevap 17/07/2012 saat 18:11
kaynak kullanıcı

oy
2

Bu soluton hattını dikkat LÜTFEN, benim için çalışıyor

[tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height+160) animated:YES];

Bunu sizinle çalışmak maç için 160 değerini değiştirebilirsiniz

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = activeField.superview.frame;
                        bkgndRect.size.height += kbSize.height;
     [activeField.superview setFrame:bkgndRect];
     [tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height+160) animated:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
   activeField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
 {
     activeField = nil;
 }
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    tableView.contentInset = contentInsets;
    tableView.scrollIndicatorInsets = contentInsets;
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = activeField.superview.frame;
    //bkgndRect.size.height += kbSize.height;
    [activeField.superview setFrame:bkgndRect];
    [tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height) animated:YES];
}
Cevap 02/12/2011 saat 19:28
kaynak kullanıcı

oy
2

Bir tablodaki textfields sahip olduğundan, en iyi yolu gerçekten tabloyu yeniden boyutlandırmak için - eğer zaman tekrar (Etrafa 165 piksel düşünüyorum) Klavyenin boyutu ile yüksekliğinde küçük olması tableView.frame ayarlayın ve genişletmek gerekir klavye atlamamış.

Eğer kullanıcı kaydırma istemiyorsanız Sen yanı o zaman da tableView için devre dışı kullanıcı etkileşimi isteğe bağlı olarak.

Cevap 28/02/2009 saat 19:37
kaynak kullanıcı

oy
1

Küçük varyasyon Swift 4.2 ...

Benim UITableView ben birçok kesimi vardı ama mecburdum kayan başlık etkisini önlemek yüzden bir "kullanılan dummyViewHeight burada Yığın taşması başka bir yerde görüldüğü gibi" bir yaklaşım ... Yani bu + Bu sorun için benim çözüm (o klavye için de çalışıyor ise araç çubuğu + öneriler):

sınıf sabiti olarak ilan:

let dummyViewHeight: CGFloat = 40.0

Sonra

override func viewDidLoad() {
    super.viewDidLoad()
    //... some stuff here, not needed for this example

    // Create non floating header
    tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: dummyViewHeight))
    tableView.contentInset = UIEdgeInsets(top: -dummyViewHeight, left: 0, bottom: 0, right: 0)

    addObservers()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    removeObservers()
}

Ve burada bütün büyü ...

@objc func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        let keyboardHeight = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.size.height
        tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
        tableView.contentInset = UIEdgeInsets(top: -dummyViewHeight, left: 0, bottom: keyboardHeight, right: 0)
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    UIView.animate(withDuration: 0.25) {
        self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: self.dummyViewHeight))
        self.tableView.contentInset = UIEdgeInsets(top: -self.dummyViewHeight, left: 0, bottom: 0, right: 0)
    }
}
Cevap 08/10/2018 saat 10:45
kaynak kullanıcı

oy
1

viewDidLoad

-(void)viewdidload{

[super viewdidload];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
}

    -(void)keyboardWillChange:(NSNotification*)sender{

        NSLog(@"keyboardwillchange sender %@",sender);

float margin=0  // set your own topmargin


        CGFloat originY = [[sender.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;


        if (originY >= self.view.frame.size.height){

            NSLog(@"keyboardclose");



            [tb_ setFrame:CGRectMake(0, margin, self.view.frame.size.width, self.view.frame.size.height-margin)];

        }else{

            NSLog(@"keyobard on");

            float adjustedHeight = self.view.frame.size.height - margin - (self.view.frame.size.height-originY);

            [tb_ setFrame:CGRectMake(0, margin, self.view.frame.size.width, adjustedHeight)];
        }







    }
Cevap 12/02/2016 saat 09:14
kaynak kullanıcı

oy
1

Bunları kullanıyorum ve bir cazibe gibi çalışır:

BSKeyboardControls - BSKeyboardControls github

TPKeyboardAvoiding - TPKeyboardAvoiding github

Cevap 13/02/2014 saat 09:30
kaynak kullanıcı

oy
1

Benim projelerinde genellikle bu kullanırlar. Bu çözüm scrollviews, tableviews veya CollectionViews ile çalışır ve kurulumu kolaydır. Ayrıca otomatik metin alanları aracılığıyla geçiş için klavyede yukarı “İleri” düğmeleri kanca.

Kontrol et burada

Cevap 12/02/2014 saat 21:27
kaynak kullanıcı

oy
1

Ben şapka benim çözüm (Ya QuickDialog ait olduğunu) atar. Temelde kaydırma için animasyon uygulamak için bekleyin. Bunun yerine sihirli sayının klavye animasyon JIT almak güzel olurdu.

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    if (textField == self.emailTextField) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 50 * USEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
        });
    }
}
Cevap 28/01/2014 saat 19:05
kaynak kullanıcı

oy
1

Kolay ve hızlı çözüm.

kaydırma yaşandığında ben sadece doğru hücreye ilerleyin

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView 

Şimdi tabloyu biliyorum varsayarsak bu modda "_keepMyCellOnTop" & I Seçili hücreyi biliyorum "_selectedCellIndex" olduğu veya seçilen hücreye ilerleyin

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{

    if (_keepMyCellOnTop)
    {
        [self.tableView scrollToRowAtIndexPath:_selectedCellIndex atScrollPosition:UITableViewScrollPositionTop animated:NO];
    }
}

Bu kaydırma önleyecektir.

Kod yerleştirmek -(void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView yukarı ve aşağı bir kaydırma neden olur

Cevap 31/12/2013 saat 13:37
kaynak kullanıcı

oy
1

Google hem yığın taşması aracılığıyla bulunan çözümlerin bir kitle sevk sonra ben sadece kendim böyle bir sorunu çözdük.

İlk olarak, UIScrollView bir IBOutlet kurdunuz emin lütfen, Sonra yakından göz atın Elma Doc: Klavye Yönetimi . Eğer arka plan ilerleyebilirsiniz ancak klavye yine Metin Alanları kapsıyorsa Son olarak, bu kod parçasına bir göz atın:

// If active text field is hidden by keyboard, scroll it so it's visible
// Your application might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;

if (aRect.size.height < activeField.frame.origin.y+activeField.frame.size.height) {

    CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y+activeField.frame.size.height-aRect.size.height);

    [scrollView setContentOffset:scrollPoint animated:YES];

Bu parçada ve eğer durumda Apple'ın yalanlarına arasındaki temel fark. Ben kaydırma mesafesi ve klavye kapsadığı metin alanı doğru değildir olmadığının durumun elma hesaplama inanıyoruz, bu yüzden yukarıdaki gibi benim modifikasyon yapılmış.

Eğer işe yararsa beni bilgilendir

Cevap 18/08/2012 saat 11:10
kaynak kullanıcı

oy
1

İşte Sam Ho ve Marcel W'nin cevapları ve benim bok kod yapılan kendi hata düzeltmeleri bazılarının bir karışımı olan bu eserin gerçekleştirme şekli. Bir UITableViewController kullanıyordum. Klavye gösterildiğinde tablo artık doğru boyutlandırır.

1) 'de viewDidLoadI eklendi:

self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

2) çağırmak için unutmuştu superiçinde eşdeğer viewWillAppearve awakeFromNib. Ben de bunları geri ekledi.

Cevap 26/07/2012 saat 18:18
kaynak kullanıcı

oy
1

senin UITableView UITableViewController olup UITableView bir alt sınıf tarafından yönetilen ve metin alanı temsilci UITableViewController olduğu ise, yönetmek gereken tüm otomatik kaydırma - Tüm bu diğer yorumlar pratikte uygulamak çok zordur.

iyi bir örnek için elma örnek kod projesini bakın: TaggedLocations.

Sen otomatik kayar olduğunu görebilirsiniz, ancak bunu yapar herhangi bir kod olarak görünmüyor. Bu proje aynı zamanda özel Tablo görünümünü hücrelerini vardır, bu nedenle kılavuz olarak onunla uygulama oluşturmak, sen istenen sonucu almak gerekir.

Cevap 05/03/2012 saat 07:09
kaynak kullanıcı

oy
1

Bir başka kolay yöntemi (tek bölüm ile çalışır)

//cellForRowAtIndexPath
UItextField *tf;
[cell addSubview:tf];
tf.tag = indexPath.row;
tf.delegate = self;

//textFieldDidBeginEditing:(UITextField *)text
[[self.tableView scrollToRowsAtIndexPath:[NSIndexPath indexPathForRow:text.tag in section:SECTIONINTEGER] animated:YES];
Cevap 23/11/2011 saat 17:25
kaynak kullanıcı

oy
1

Yorucu çalışma saatleri (başarısız tamamen ve) bu akım çözümleri kullanmaya çalışırken sonra Yani nihayet iyi çalışıyor şeyler var ve yeni animasyon blokları kullanmalarını güncellendi. Benim cevabım tamamen dayanmaktadır yukarıda ORTWIN cevabı .

Yani her nedense Yukarıdaki kod sadece benim için çalışmıyordu. Benim kurulum başkalarına oldukça benzer görünüyordu, ama bir iPad veya 4.3 ... hiçbir fikri üzerine belki çünkü. Bazı tuhaf matematik çalışıp ekranın dışına benim tableView çekiyordum.

: My çözümün nihai sonucunu görmek http://screencast.com/t/hjBCuRrPC (fotoğraf görmezden Lütfen :-P.)

Bu yüzden Ortwin ne yaptığını esasından ile gittik, ama klavyenin yüksekliği ile benim masa bakış origin.y & size.height yukarı eklemek için bazı matematik nasıl olduğunu değişti. O sonucundan penceresinin yüksekliğini çıkarmak, bu döndüğünü ne kadar kavşak söylüyor. onun daha büyük 0 (aka bir örtüşme yoktur) ben çerçeve yüksekliği animasyon gerçekleştirmek.

Buna ek olarak bazı animasyon tamamlanana dek hücreye gitmek için bekleyen 1 tarafından çözüldü sorunları) ve klavyeyi gizleme zaman 2) UIViewAnimationOptionBeginFromCurrentState seçeneğini kullanarak yeniden çizme vardı.

Birkaç Unutulmaması gereken.

  • _topmostRowBeforeKeyboardWasShown ve _originalFrame başlığında bildirilen örnek değişkenlerdir.
  • self.guestEntryTableView benim tableView (Harici bir dosyada değilim) 'dir
  • IASKCGRectSwap bir çerçeve koordinatlarını ters çevrilmesi için ORTWIN yöntemi olup
  • da en azından 50px gösteren olacak eğer sadece tableView yüksekliğini güncellemek
  • Bir UIViewController değilim beri self.view yok, bu yüzden sadece orijinal çerçeveye tableView dönmek

Ben Ortwin bunun dönüm noktası vermedi eğer Yine, bu cevap yakınında kazanılmış olmazdı. İşte kod:

- (IBAction)textFieldDidBeginEditing:(UITextField *)textField
{
    self.activeTextField = textField;

    if ([self.guestEntryTableView indexPathsForVisibleRows].count) {
        _topmostRowBeforeKeyboardWasShown = (NSIndexPath*)[[self.guestEntryTableView indexPathsForVisibleRows] objectAtIndex:0];
    } else {
        // this should never happen
        _topmostRowBeforeKeyboardWasShown = [NSIndexPath indexPathForRow:0 inSection:0];
        [textField resignFirstResponder];
    }
}

- (IBAction)textFieldDidEndEditing:(UITextField *)textField
{
    self.activeTextField = nil;
}

- (void)keyboardWillShow:(NSNotification*)notification {
    NSDictionary* userInfo = [notification userInfo];

    NSValue* keyboardFrameValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

    // Reduce the tableView height by the part of the keyboard that actually covers the tableView
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
    CGRect viewRectAbsolute = [self.guestEntryTableView convertRect:self.guestEntryTableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
    CGRect keyboardFrame = [keyboardFrameValue CGRectValue];
    if (UIInterfaceOrientationLandscapeLeft == orientation ||UIInterfaceOrientationLandscapeRight == orientation ) {
        windowRect = IASKCGRectSwap(windowRect);
        viewRectAbsolute = IASKCGRectSwap(viewRectAbsolute);
        keyboardFrame = IASKCGRectSwap(keyboardFrame);
    }

    // fix the coordinates of our rect to have a top left origin 0,0
    viewRectAbsolute = FixOriginRotation(viewRectAbsolute, orientation, windowRect.size.width, windowRect.size.height);

    CGRect frame = self.guestEntryTableView.frame;
    _originalFrame = self.guestEntryTableView.frame;

    int remainder = (viewRectAbsolute.origin.y + viewRectAbsolute.size.height + keyboardFrame.size.height) - windowRect.size.height;

    if (remainder > 0 && !(remainder > frame.size.height + 50)) {
        frame.size.height = frame.size.height - remainder;
        float duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        [UIView animateWithDuration: duration
                        animations:^{
                            self.guestEntryTableView.frame = frame;
                        }
                        completion:^(BOOL finished){
                            UITableViewCell *textFieldCell = (UITableViewCell*) [[self.activeTextField superview] superview];
                            NSIndexPath *textFieldIndexPath = [self.guestEntryTableView indexPathForCell:textFieldCell];
                            [self.guestEntryTableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
                        }];
    }

}

- (void)keyboardWillHide:(NSNotification*)notification {
    NSDictionary* userInfo = [notification userInfo];
    float duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    [UIView animateWithDuration: duration
                          delay: 0.0
                        options: (UIViewAnimationOptionBeginFromCurrentState)
                     animations:^{
                         self.guestEntryTableView.frame = _originalFrame;
                     }
                     completion:^(BOOL finished){
                         [self.guestEntryTableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
                     }];

}   

#pragma mark CGRect Utility function
CGRect IASKCGRectSwap(CGRect rect) {
    CGRect newRect;
    newRect.origin.x = rect.origin.y;
    newRect.origin.y = rect.origin.x;
    newRect.size.width = rect.size.height;
    newRect.size.height = rect.size.width;
    return newRect;
}

CGRect FixOriginRotation(CGRect rect, UIInterfaceOrientation orientation, int parentWidth, int parentHeight) {
    CGRect newRect;
    switch(orientation)
    {
        case UIInterfaceOrientationLandscapeLeft:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), rect.origin.y, rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationLandscapeRight:
            newRect = CGRectMake(rect.origin.x, parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationPortrait:
            newRect = rect;
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
    }
    return newRect;
}
Cevap 18/07/2011 saat 09:45
kaynak kullanıcı

oy
1

Neredeyse aynı yaklaşımı denedik ve aynı için daha basit ve daha küçük kod ile geldi. Bir IBOutlet iTextView yarattı ve IB UITextView ile ilişkili.

 -(void)keyboardWillShow:(NSNotification *)notification
    {
        NSLog(@"Keyboard");
        CGRect keyFrame = [[[notification userInfo]objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];

        [UIView beginAnimations:@"resize view" context:nil];
        [UIView setAnimationCurve:1];
        [UIView setAnimationDuration:1.0];
        CGRect frame = iTableView.frame;
        frame.size.height = frame.size.height -  keyFrame.size.height;
        iTableView.frame = frame;
        [iTableView scrollRectToVisible:frame animated:YES];
        [UIView commitAnimations];

    }
Cevap 13/05/2011 saat 06:00
kaynak kullanıcı

oy
1

Bu mükemmel çalışıyor ve çok iPad'de.

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{

    if(textField == textfield1){
            [accountName1TextField becomeFirstResponder];
        }else if(textField == textfield2){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield3 becomeFirstResponder];

        }else if(textField == textfield3){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield4 becomeFirstResponder];

        }else if(textField == textfield4){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield5 becomeFirstResponder];

        }else if(textField == textfield5){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:3 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield6 becomeFirstResponder];

        }else if(textField == textfield6){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:4 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield7 becomeFirstResponder];

        }else if(textField == textfield7){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:5 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield8 becomeFirstResponder];

        }else if(textField == textfield8){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:6 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield9 becomeFirstResponder];

        }else if(textField == textfield9){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:7 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textField resignFirstResponder];
        }
Cevap 23/10/2010 saat 08:11
kaynak kullanıcı

oy
0

UITableViewController kullanırken ben sadece başka hata keşfetti. Klavye ortaya çıktığında otomatik kaydırma değildi. Bunun nedeni UITableView contentInsetAdjustmentBehavior = .never ait olduğunu fark ettim.

Cevap 03/07/2019 saat 21:30
kaynak kullanıcı

oy
0

animasyonlar ve klavye çerçevesi değiştirme ile Swift 3-4 için Çözüm:

İlk olarak bir Bool oluşturun:

// MARK: - Private Properties
private var isKeyboardShowing = false

İkincisi, sistem Klavye Bildirimler'in Gözlemci ekleyin:

// MARK: - Overriding ViewController Life Cycle Methods
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: .UIKeyboardWillHide, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeFrame), name: .UIKeyboardWillChangeFrame, object: nil)
}

Üçüncü olarak, animasyon fonksiyonu hazırlanması:

func adjustTableViewInsets(keyboardHeight: CGFloat, duration: NSNumber, curve: NSNumber){
    var extraHeight: CGFloat = 0
    if keyboardHeight > 0 {
        extraHeight = 20
        isKeyboardShowing = true
    } else {
        isKeyboardShowing = false
    }

    let contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight + extraHeight, right: 0)
    func animateFunc() {
        //refresh constraints
        //self.view.layoutSubviews()
        tableView.contentInset = contentInset
    }

    UIView.animate(withDuration: TimeInterval(duration), delay: 0, options: [UIViewAnimationOptions(rawValue: UInt(curve))], animations: animateFunc, completion: nil)
}

Sonra (gözlemciler tarafından çağrılan) hedef / eylem yöntemlerini ekleyin:

// MARK: - Target/Selector Actions
func keyboardWillShow(notification: NSNotification) {
    if !isKeyboardShowing {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = keyboardSize.height

            let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
            let curve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber

            adjustTableViewInsets(keyboardHeight: keyboardHeight, duration: duration, curve: curve)
        }
    }
}

func keyboardWillHide(notification: NSNotification) {
    let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
    let curve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber
    adjustTableViewInsets(keyboardHeight: 0, duration: duration, curve: curve)
}

func keyboardWillChangeFrame(notification: NSNotification) {
    if isKeyboardShowing {
        let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
        let curve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber

        if let newKeyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = newKeyboardSize.height
            adjustTableViewInsets(keyboardHeight: keyboardHeight, duration: duration, curve: curve)
        }
    }
}

Son olarak, deinit veya viewWillDisappear içinde gözlemci kaldırmak unutmayın:

deinit {
    NotificationCenter.default.removeObserver(self)
}
Cevap 10/06/2018 saat 15:48
kaynak kullanıcı

oy
0

Herhangi Hesaplamalar, kodunun altına kullanın Gerek Yok işe yarayacak: Ben Özelleştirilmiş UITableViewCell kullanılan bu kod, bu çalışma var:

override func viewDidLoad() {
super.viewDidLoad()

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)}


func keyboardWillShow(_ notification:Notification) {

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
}}


func keyboardWillHide(_ notification:Notification) {

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
}}
Cevap 22/02/2018 saat 07:47
kaynak kullanıcı

oy
0

Swift 4 tam çözüm:

  • Doğru klavye çerçeve değişiklikleri (örneğin klavye yüksekliği, normal klavyeden → emojii gibi değiştirir) ile çalışır.
  • UITableView örneğin TabBar ve araç çubuğu desteği (diğer örnekler de yanlış-parçalar alma).
  • (Kodlanmış değil) Dinamik animasyon süresi.
  • Protokol odaklı kolayca herhangi bir durumda kullanabilirsiniz böylece.
  • Kaydırma insets çok çalışır.

Ben (siz olarak indirebilirsiniz yardımcı protokolünü yazdı özünden o StackOverflow'daki göndermek için çok büyük olduğu için,) görünümünüze yüzden sadece gerekir:

  1. Benimseyin KeyboardChangeFrameObserverprotokolü:

    func willChangeKeyboardFrame(height: CGFloat, animationDuration: TimeInterval, animationOptions: UIViewAnimationOptions)
    
  2. Çağrı observeKeyboardFrameChanges()görünür üzerinde.

tableView için bu protokolün uygulanmasının örneği:

class TestViewController: UITableViewController, KeyboardChangeFrameObserver {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        observeKeyboardFrameChanges()
    }

    func willChangeKeyboardFrame(height: CGFloat, animationDuration: TimeInterval, animationOptions: UIViewAnimationOptions) {
        var adjustedHeight = height

        if let tabBarHeight = self.tabBarController?.tabBar.frame.height {
            adjustedHeight -= tabBarHeight
        } else if let toolbarHeight = navigationController?.toolbar.frame.height, navigationController?.isToolbarHidden == false {
            adjustedHeight -= toolbarHeight
        }

        if adjustedHeight < 0 { adjustedHeight = 0 }

        UIView.animate(withDuration: animationDuration, animations: {
            let newInsets = UIEdgeInsets(top: 0, left: 0, bottom: adjustedHeight, right: 0)
            self.tableView.contentInset = newInsets
            self.tableView.scrollIndicatorInsets = newInsets
        })
    }

}
Cevap 12/01/2018 saat 00:10
kaynak kullanıcı

oy
0
// scroll tableview so content ends at the middle of the tableview (out of the way of the keyboard)
CGPoint newContentOffset = CGPointMake(0, [self.tableView contentSize].height - (self.tableView.bounds.size.height / 2));
[self.tableView setContentOffset:newContentOffset animated:YES];
Cevap 27/06/2017 saat 21:12
kaynak kullanıcı

oy
0

Benim sürümü bak :)

    - (void)keyboardWasShown:(NSNotification *)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = cellSelected.superview.frame;
    bkgndRect.size.height += kbSize.height;
    [cellSelected.superview setFrame:bkgndRect];
    [tableView setContentOffset:CGPointMake(0.0, cellSelected.frame.origin.y-kbSize.height) animated:YES];
}


- (void)keyboardWasHidden:(NSNotification *)aNotification
{
    [tableView setContentOffset:CGPointMake(0.0, 0.0) animated:YES];
}
Cevap 02/07/2016 saat 20:32
kaynak kullanıcı

oy
0

İşte iOS7 Takvim uygulamasından "Olay düzenlemek" ekranında esinlenerek benim çözümdür.

Bu çözümün kilit noktalarından biri klavye zaman kaydırdığı tablo görevden olmasıdır.

Uygulama:

1) Seçilen textfield'ı depolayacak özellik ekleyin:

@property (strong) UITextField *currentTextField;

ve biz klavye zaman kaydırdığı tablo gizlemeniz gerekiyorsa biz kontrol etmek kullanacağız BOOL değişken.

BOOL hideKeyboardOnScroll;

2) UITextField temsilci geri aramalar Kulp:

#pragma mark - UITextFieldDelegate

- (void) textFieldDidBeginEditing: (UITextField *) textField {
    self.currentTextField = textField;
}

- (void) textFieldDidEndEditing: (UITextField *) textField {
    self.currentTextField = nil;
}

- (BOOL) textFieldShouldReturn: (UITextField *) textField {
   [textField resignFirstResponder];

    CGPoint newContentOffset = CGPointZero;
    if (tableView.contentSize.height > tableView.frame.size.height) {
        newContentOffset.y = MIN(tableView.contentOffset.y, tableView.contentSize.height - tableView.frame.size.height);
    }
    [tableView setContentOffset: newContentOffset animated: YES];

    return YES;
}

3) kullanıcı kaydırma görünümü kontrol etmek UIScrollViewDelegate yöntem kullanınız.

#pragma mark - UIScrollViewDelegate

- (void) scrollViewDidScroll: (UIScrollView *) scrollView {
    if (hideKeyboardOnScroll == YES) {
        [self.currentTextField resignFirstResponder];
    }
}

4) viewcontroller en [viewWillAppear] yönteminde klavye bildirimleri abone ve [viewWillDisappear] yönteminde çıkmak.

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];

    [ [NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:)
                                                  name: UIKeyboardWillShowNotification object: nil];
    [ [NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillHide:)
                                                  name: UIKeyboardWillHideNotification object: nil];
}

- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];

    [ [NSNotificationCenter defaultCenter] removeObserver: self name: UIKeyboardDidShowNotification object: nil];
    [ [NSNotificationCenter defaultCenter] removeObserver: self name: UIKeyboardWillHideNotification object: nil];    
}

5) klavye bildirimleri Kulp:

- (void) keyboardWillShow: (NSNotification *) notification {
    CGRect keyboardFrame = [ [ [notification userInfo] objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue];

    // Find cell with textfield.
    CGRect textFieldFrame = [tableView convertRect: self.currentTextField.frame fromView: self.currentTextField];
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint: textFieldFrame.origin];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath: indexPath];
    //

    // Shrink tableView size.
    CGRect tableViewFrame = tableView.frame;
    tableView.frame = CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y, tableView.frame.size.width,
                             self.view.frame.size.height - tableView.frame.origin.y - keyboardFrame.size.height);
    //

    // Check if cell is visible in shrinked table size.
    BOOL cellIsFullyVisible = YES;
    if ( cell.frame.origin.y < tableView.contentOffset.y ||
        (cell.frame.origin.y + cell.frame.size.height) > (tableView.contentOffset.y + tableView.frame.size.height) ) {
        cellIsFullyVisible = NO;
    }
    //

    // If cell is not fully visible when scroll table to show cell;
    if (cellIsFullyVisible == NO) {
        CGPoint contentOffset = CGPointMake(tableView.contentOffset.x, CGRectGetMaxY(cell.frame) - tableView.frame.size.height);
        if (cell.frame.origin.y < tableView.contentOffset.y) {
            contentOffset.y = cell.frame.origin.y;
        }
        contentOffset.y = MAX(0, contentOffset.y);

        // For some reason [setContentOffset] is called without delay then
        // this code may not work for some cells. That why we call it with brief delay.
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC));
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [UIView animateWithDuration: 0.5 animations:^{
                [tableView setContentOffset: contentOffset animated: NO];
            } completion: ^(BOOL finished) {
                hideKeyboardOnScroll = YES;
            }];
        });
    } else {
        hideKeyboardOnScroll = YES;
    }
    //

    // Finally restore original table frame.
    tableView.frame = tableViewFrame;
    //
}

- (void) keyboardWillHide: (NSNotification *) notification {
    [super keyboardWillHide: notification];

    hideKeyboardOnScroll = NO;
}
Cevap 21/08/2014 saat 15:43
kaynak kullanıcı

oy
0

Ben en iyi yolu UITableViewController aracılığıyla olduğunu düşünüyorum.

Bir UIViewController bir UITableView istiyorsanız , sadece gömülü UITableViewController ile contentView yapmak ve UIViewController viedDidLoad aşağıdaki satırları koymak:

self.tableView = ((UITableViewController*)self.childViewControllers[0]).tableView;
self.tableView.delegate = self;
self.tableView.dataSource = self;

Kolay;)

Cevap 06/06/2014 saat 16:29
kaynak kullanıcı

oy
0

Bunu yapmak için "doğru" yolu olduğunu düşünüyorum. Eğer kullanım durumu için en uygun çözümü seçmek zorunda. Benim iPad App ben bir var UIViewControllerkalıcı gösterilmesi ise UIModalPresentationFormSheetbir oluşmaktadır UITableView. Bu tabloda, iki içeren UITextFieldshücre başına. Sadece çağıran scrollToRowAtIndexPath:atScrollPosition:animated:içinde textFieldDidBeginEditing:yönteme benim için çalışmaz. Bu yüzden bir oluşturduk tableFooterView:

- (void)viewDidLoad
{
    [super viewDidLoad];

    m_footerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, m_tableView.frame.size.width, 300.0f)];
    [m_footerView setBackgroundColor:[UIColor clearColor]];
    [m_tableView setTableFooterView:m_footerView];
    [m_footerView release];
}

Fikir klavye gizler olmasıdır tableFooterViewdeğil UITextFields. Yani tableFooterViewyeterince yüksek olmalıdır. Bundan sonra kullanabilirsiniz scrollToRowAtIndexPath:atScrollPosition:animated:içinde textFieldDidBeginEditing:yöntemle.

Ben göstermek ve gizlemek de mümkün olduğunu düşünüyorum tableFooterViewklavye bildirimleri için gözlemci ekleyerek dinamik ama bunu henüz denemedim:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillHide:) 
                                                 name:UIKeyboardWillHideNotification 
                                               object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification 
{
     [m_tableView setTableFooterView:m_footerView];
}

- (void)keyboardWillHide:(NSNotification *)notification 
{
     [m_tableView setTableFooterView:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
Cevap 15/09/2012 saat 08:51
kaynak kullanıcı

oy
0

Ben benim durumumda ben sadece klavye ortaya çıktığında tablo görünümü kadar gitmek yapmak gerekir, klavye ile bu sorunu çözer küçük bir proje oluşturun yaptı.

Bu yardımcı olur umarım!

http://git.io/BrH9eQ

Cevap 19/11/2011 saat 21:21
kaynak kullanıcı

oy
0

Sadece iOS 5.0 lib referans içine tekrar baktı ve başlıklı bu bölümde "klavyenin alt kısmında bulunan İçerik Moving" bulundu: TextAndWebiPhoneOS KeyboardManagement

Bu belki de iOS 5 beri yeni mi? Başka bir şey ortasındayım olarak henüz içine okumadığınız ama belki diğerleri daha biliyorum ve beni burada ve başkalarını aydınlatmak olabilir.

Elma doc Burada tartışılan veya bilgi hala burada iOS 5 SDK kullanıcılarına yararlıdır neler olup yerini mu?

Cevap 26/10/2011 saat 12:07
kaynak kullanıcı

oy
0

UITableViewControllerKaydırma gerçekten de otomatik olarak yapar. Kullanılmasına kıyasla fark, UIViewControllersen kullanarak programlı Navbar'ın Buttonitems oluşturmak zorunda yani, NavigationControllerbir kullanırken, TableViewController.

Cevap 20/03/2011 saat 20:59
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more