2012-10-02 19 views

cevap

2

Öncelikle her şeyi tutmak için bir görünüm oluşturun. o tableview .Add altında araç çubuğu

UIView *placeholderView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 400, 440)]; 
    UITableView *tv=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 400, 400)]; 
    [placeholderView addSubview:tv]; 
    UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 400, 400, 40)]; 
    [placeholderView addSubview:toolBar]; 
5

Kullanım yerine UITableViewController alt sınıfının bir UIViewController alt sınıf textfield'ı görünecek şekilde Sonra bir UITableView ve UIToolbar programlı set çerçeve ekleyin.

@interface ChatViewController : UIViewController 
@end 


#import "ChatViewController.h" 

@interface ChatViewController() <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate> 
@property (nonatomic, strong) UITableView *tableView; 
@property (nonatomic, strong) UIToolbar *toolbar; 
@property (nonatomic, strong) UITextField *textField; 
@end 

@implementation ChatViewController 

-(UITableView *)tableView 
{ 
    if (!_tableView) { 
     _tableView = [UITableView alloc] init]; 
     CGRect frame = self.view.bounds; 
     frame.size.height = frame.size.height - 44; 
     _tableView.frame = frame; 
     _tableView.delegate = self; 
     _tableView.dataSource = self; 
    } 
    return _tableView; 
} 

-(UIToolbar *)toolbar 
{ 
    if (!_toolbar) { 
     _toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,self.tableView.frame.size.height,self.view.frame.size.width, 44)]; 
    self.textField = [[UITextField alloc] initWithFrame:CGRectMake(0,0,_toolbar.frame.size.width -20)]; 
    self.textField.delegate = self; 
    UIBarButtonItem *textFieldItem = [[UIBarButtonItem alloc] initWithCustomView:self.textField]; 
    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
                        target:nil 
                        action:nil]; 
    // You'll need to add a button to send you text 
    _toolbar.items = [NSArray arrayWithObjects:flexibleSpace, textFieldItem, flexibleSpace, nil]; 
    } 
    return _toolbar; 
} 

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.view addSubview:self.tableView]; 
    [self.view addSubview:self.toolbar]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillHideOrShow:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillHideOrShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
} 

- (void)viewDidUnload 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super viewDidUnload]; 
} 


- (void)keyboardWillHideOrShow:(NSNotification *)note 
{ 
    NSDictionary *userInfo = note.userInfo; 
    NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]; 

    CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    CGRect keyboardFrameForToolbar = [self.toolbar.superview convertRect:keyboardFrame fromView:nil]; 
    CGRect keyboardFrameForTableView = [self.tableView.superview convertRect:keyboardFrame fromView:nil]; 

    CGRect newToolbarFrame = self.toolbar.frame; 
    newToolbarFrame.origin.y = keyboardFrameForToolbar.origin.y - newToolbarFrame.size.height; 

    CGRect newTableViewFrame = self.tableView.frame; 
    newTableViewFrame.size.height = keyboardFrameForTableView.origin.y - newToolbarFrame.size.height; 

    [UIView animateWithDuration:duration 
          delay:0 
         options:UIViewAnimationOptionBeginFromCurrentState | curve 
        animations:^{self.toolbar.frame = newToolbarFrame; 
         self.tableView.frame =newTableViewFrame;} 
        completion:nil]; 
} 

Bu görünümler dışarı atarken ve klavye görünümünü animasyon işlemek olacaktır:

böyle bir şey olması gerekir. Tablo görünümü ve metin alanı için temsilci ve veri kaynağı yöntemlerini kullanmanız gerekir.

+0

İyi cevap, umut verici görünüyor ama tablo görünümü ve araç çubuğu boyutları düzgün ayarlandığı sürece 'UITableViewController' kullanmanın herhangi bir sakıncası olmadığını tahmin ediyorum. Neden UITableViewController' kullanmamayı önerdin merak ediyorum? –

+0

'UITableViewController', alt görünümlerini tablo görünümü olan ana görünümüne eklemeyi denediğinizde zor olabilir. – Moxy

26

Daha iyi bir numara buldum!

  1. NOT (Xcode sihirli altta sizin için yerleştirecektir) YOK Gezinme Çubuğu
  2. Drag (sizin başarısız girişimden itibaren) olduğundan emin olun ve bir "Bar Düğme Öğe" drop: Uygulamayı Şimdi Çalıştırırsanız, hiçbir şey görmeyeceksiniz!
  3. viewDidLoad altında aşağıdaki kod satırını ekleyin (bu yüzden okumaya devam):

self.navigationController.toolbarHidden = HAYIR;

Bitti!

+0

Bu tam olarak aradığım şey! –

+0

Sen çivilenmişsin! Bir milyona teşekkürler. Başlangıçta vardı ve sonra onu kaldırdım ve nasıl geri koyduğumu unuttum. – pqsk

+0

Çalışıyor! Ayrıca UIBarButtonItem renk tonunun beyaz olmadığından emin olunuz ... – rjobidon

1

Bazı şekillerde bu harika bir şey değil, ancak bunu ek bir View Controller'da bir Container View kullanarak çözdüm.

Storyboard screenshot

Tablo VC segue için Orta VC

Ben çözüm "Nav Denetleyicisindeki Toolbar" yerine bu kullanılan "Yerleştir" dir Ben ile varolan uygulama tasarımına bu ekliyorum çünkü ~ 15 ekran ve farklı ekranlarda farklı araç çubuklarını nasıl yapılandıracağımı bilmiyordum.

+0

Bunun mükemmel olmadığını kabul ediyorum, ancak IOS'a sadece bir UTIiolControl ekleyemezsiniz. UINavigationController. Durumumda UINC'ları UINC'nin diğer "tasarım özellikleri" nedeniyle bir UINC'ye gömemem. –