Изменение размера пользовательского интерфейса после появления клавиатуры. Проблемы с размерами и размерами

#ios #ios7 #xamarin.ios

#iOS #ios7 #xamarin.ios

Вопрос:

Я хочу изменить размер пользовательского интерфейса (например, текстового поля, UIGridView, …) после появления клавиатуры. Получение соответствующих событий не является проблемой. Я действительно запасаюсь, вычисляя дельту, чтобы уменьшить мой вид в зависимости от высоты клавиатуры.

Если передо мной iPad в портретном режиме, все вычисления выполняются так, как ожидалось. Но если мое устройство находится в альбомном режиме или перевернуто, я действительно изо всех сил пытаюсь получить правильные размеры! Некоторые рамки / границы представления не преобразуются (в ландшафтном режиме высота еще выше, чем ее ширина). Другие представления переводятся в зависимости от того, запустил ли я свое приложение уже в альбомном режиме. Следующая задача — работать с согласованными измерениями размера. Иногда размеры соответствуют реальным пикселям (для нового iPad 2048), иногда коэффициент масштабирования не учитывается (для нового iPad 1024).

Любая другая идея, как выбрать правильный размер кадра? Или есть какие-либо помощники, которые распознают текущую ориентацию и предоставляют мне эффективные размеры?

Мой текущий код для достижения ожидаемого поведения выглядит следующим образом:

MyViewController

 public override void ViewWillAppear(bool animated)
{
    base.ViewWillAppear(animated);

    // My code...

    AppDelegate.CurrentDelegate.KeyboardAppeared  = KeyboardAppeared;
    AppDelegate.CurrentDelegate.KeyboardDisappeared  = KeyboardDisappeared;
}

public override void ViewWillDisappear(bool animated)
{
    base.ViewWillDisappear(animated);

    AppDelegate.CurrentDelegate.KeyboardAppeared -= KeyboardAppeared;
    AppDelegate.CurrentDelegate.KeyboardDisappeared -= KeyboardDisappeared;
}
private void KeyboardAppeared(object sender, KeyboardEventArgs e)
{
    if (_keyboardButton != null)
        _keyboardButton.Enabled = true;

    var frame = LayoutHelper.RectangleForKeyboardAppearance(_textField, View.Window, e.Height);
    LayoutHelper.ResizeViewForKeyboard(_textField, frame);
}

private void KeyboardDisappeared(object sender, EventArgs e)
{
    if (_keyboardButton != null)
        _keyboardButton.Enabled = false;

    var frame = View.Bounds;
    LayoutHelper.ResizeViewForKeyboard(_textField, frame);
}
  

MyHelperClass

 public static RectangleF RectangleForKeyboardAppearance(UIView view, float windowHeight, float keyboardHeight)
{
    var topOfKeyboard = windowHeight - keyboardHeight; // Obere linke Ecke der Tastatur auf den Bildschirm bezogen
    var viewHeightWindow1 = view.ConvertPointFromView(new PointF(0, topOfKeyboard), null);
    var frame = new RectangleF(view.Frame.X, view.Frame.Y, view.Frame.Width, (viewHeightWindow1.Y   view.Bounds.Y));


    return frame;
}

public static void ResizeViewForKeyboard(UIView view, RectangleF frame)
{
    UIView.BeginAnimations("viewMovementForKeyboard");
    UIView.SetAnimationBeginsFromCurrentState(true);
    UIView.SetAnimationDuration(0.3f);
    view.Frame = frame;
    UIView.CommitAnimations();
}