2012-01-29 8 views
8

sto cercando di convertire questo pezzo di codice in C#, il codice è da Apple documentationLa conversione da Obj C a C#

NSDictionary* info = [aNotification userInfo]; 

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

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

scrollView.contentInset = contentInsets; 

scrollView.scrollIndicatorInsets = contentInsets; 

CGRect aRect = self.view.frame; 

aRect.size.height -= kbSize.height; 

if (!CGRectContainsPoint(aRect, activeField.frame.origin)) { 

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

    [scrollView setContentOffset:scrollPoint animated:YES]; 

Finora questo è il mio tentativo, io sono sempre attaccato alla CGRectValue.

    NSDictionary info = n.UserInfo; 

     SizeF kbSize = ((RectangleF)info[UIKeyboard.FrameBeginUserInfoKey]).Size; 

     UIEdgeInsets contentInsets = new UIEdgeInsets(0.0f, 0.0f, kbSize.Height, 0.0f); 

     this.uiScrollView.ContentInset = contentInsets; 
     this.uiScrollView.ScrollIndicatorInsets = contentInsets; 

     RectangleF aRect = this.View.Frame; 

     aRect.Size.Height -= kbSize.Height; 

     if(!aRect.Contains(_currentField.Frame)) 
     { 
      PointF scrollPoint = new PointF(0.0f, _currentField.Frame.Y - kbSize.Height); 
      this.uiScrollView.SetContentOffset(scrollPoint, true); 
     } 

non sto usando probabilmente il tipo giusto, qualcuno può darmi una mano, o un po 'di codice alternativo fare cosa simile. Grazie

+0

Non sono sicuro di cosa intendi per "Mi sto bloccando al CGRectValue". Il debugger mostra che tutte le variabili precedentemente riferite hanno i valori che ti aspetteresti? Cosa mostra il debugger su aRect dopo aRect = self.view.frame? –

+0

Non riesco a convertire quella linea in codice C#. Non viene compilato. Si prega di consultare il codice C# che ho provato. –

+0

Come si ottiene '_currentField'? Sto anche convertendo il tutorial * [iOS SDK: Keeping Content From Underneath the Keyboard] (http://code.tutsplus.com/tutorials/ios-sdk-keeping-content-from-underneath-the-keyboard--mobile -6103) * ... – testing

risposta

5

C'è qualcos'altro di sbagliato nel codice C#.

aRect.Size.Height -= kbSize.Height; 

Size è di tipo System.Drawing.SizeF che è una struttura (cioè un valore di tipo). La modifica del suo valore non verrà propagata all'istanza aRect (questo è un comportamento .NET).

Che cosa si dovrebbe fare è:

aRect.Height -= kbSize.Height; 

che sarà di ridurre effettivamente la dimensione aRect (non il Size struct che non verrà assegnato di nuovo alla RectangleF).

+0

Grazie per una buona cattura. In realtà era un bug nella mia traduzione. Ora funziona meglio, ma non è sicuro del perché UITextField salti ancora un po 'quando comincio a digitare, anche se è già visibile solo sulla parte superiore della tastiera. Qualche suggerimento? –

+0

Non senza vedere quanto salta bene ;-) ma se riesci a creare un piccolo test test indipendente che mostri il comportamento, collegalo a un bug report su http://bugzilla.xamarin.com e avremo uno sguardo a questo. – poupou

+0

Va bene, lo farà. Nel frattempo, potresti per favore farmi sapere se c'è qualche altro esempio di correzione per questo problema, cioè rendere visibile il campo di testo quando la tastiera è sopra di esso. Non sono riuscito a trovare un buon campione di lavoro finora per monotouch. Grazie per l'aiuto. –

13

capito:

((NSValue)info[UIKeyboard.FrameBeginUserInfoKey]).RectangleFValue.Size 

che dovrebbe funzionare. Anche se non riuscivo a farlo funzionare come volevo, quella riga di codice si sarebbe effettivamente compilata e tradotta nel codice Obj C.

+1

'var kbSize = ((NSValue) informazioni [UIKeyboard.FrameBeginUserInfoKey]). CGRectValue.Size;' – Arvis