2012-01-29 3 views
8

Я пытаюсь преобразовать этот кусок кода на C#, код от компании Apple documentationПереход от Obj C до 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]; 

До сих пор это моя попытка, я застрять на 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); 
     } 

Возможно, я не использую подходящий тип, может кто-то помочь мне, или какой-нибудь альтернативный код, делающий подобную вещь. Благодаря

+0

Я не уверен, что вы подразумеваете под «Я зацикливаюсь на CGRectValue». Отмечает ли отладчик, что все ранее упомянутые переменные имеют значения, которые вы ожидаете? Что показывает отладчик о aRect после aRect = self.view.frame? –

+0

Я не могу преобразовать эту строку в код C#. Он не компилируется. Пожалуйста, см. Код C#, который я пробовал. –

+0

Как вы получаете '_currentField'? Я также конвертирую учебник * [iOS SDK: хранение содержимого из-под клавиатуры] (http://code.tutsplus.com/tutorials/ios-sdk-keeping-content-from-underneath-the-keyboard--mobile -6103) * ... – testing

ответ

5

С кодом C# что-то не так.

aRect.Size.Height -= kbSize.Height; 

Size имеет тип System.Drawing.SizeF, который является структурой (то есть значение типа). Изменение значения не будет распространяться на экземпляр до aRect (это поведение .NET).

Что вы должны сделать, это:

aRect.Height -= kbSize.Height; 

, который будет уменьшить на самом деле aRect размер (не Size-структуру, которая не будет назначен обратно в RectangleF).

+0

Спасибо за хороший улов. Это было ошибкой в ​​моем переводе. Теперь он работает лучше, но не уверен, почему UITextField все еще немного подпрыгивает, когда я начинаю печатать, даже если он уже виден только поверх клавиатуры. Любое предложение? –

+0

Не зная, насколько хорошо он прыгает ;-), но если вы можете создать небольшой автономный тестовый пример, который показывает поведение, то приложите его к отчету об ошибке на странице http://bugzilla.xamarin.com, и мы будем иметь Посмотрите на это. – poupou

+0

Хорошо, сделаю. В то же время, не могли бы вы сообщить мне, есть ли другой образец исправления для этой проблемы, т. Е. Сделать текстовое поле видимым, когда клавиатура над ним. Пока я не смог найти хороший рабочий образец для монотуха. Спасибо за помощь. –

13

Фигурные это:

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

Это должно работать. Хотя я не мог заставить его работать так, как я хотел, эта строка кода фактически скомпилировала бы и перевела бы код Obj C.

+1

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