Изменить тип события GUI.Текстовые поля отвечают на

#c# #unity3d

#c# #unity3d

Вопрос:

Я создал, scrollview который содержит кнопки TextFields и переключатели.

Когда я прокручиваю представление, содержащее текстовое поле, оно фокусируется, как только я прикладываю палец к экрану ( EventType = MouseDown ), что является ужасным UX, поскольку вы не хотите, чтобы это происходило при прокрутке вниз / вверх.

Есть ли возможность сосредоточиться TextFields только при MouseUp запуске события, а не раньше?

Комментарии:

1. Какой графический интерфейс вы используете? Ваше собственное? По умолчанию Unity? NGUI? Что-то еще?

2. Это значение по умолчанию в Unity ( docs.unity3d.com/ScriptReference/GUI.TextField.html )

Ответ №1:

Я не уверен, что полностью понимаю, в чем ваша проблема, потому что я могу использовать вид прокрутки без фокусировки на соседнем текстовом поле. Однако вы можете манипулировать событием прямо перед текстовым полем. С помощью следующего кода текстовое поле получит фокус на MouseUp , независимо от того, где вы начали MouseDown

 void OnGUI()
{
    var typeBackup = Event.current.type;

    switch (Event.current.type)
    {
        case EventType.MouseDown:
            Debug.Log(Event.current);
            Event.current.type = EventType.Ignore;
            break;
        case EventType.MouseUp:
            Debug.Log(Event.current);
            Event.current.type = EventType.MouseDown;
            break;
    }

    GUILayout.TextField("I will not steal focus on MouseDown");

    if (Event.current.type != EventType.Used)
        Event.current.type = typeBackup;

}
  

В зависимости от остальной части вашего OnGUI() метода вам может потребоваться сохранить исходный тип события и восстановить его после текстового поля. Если MouseDown событие после текстового поля не имеет значения, было бы безопасно опустить эту часть.

Вы могли бы точно настроить поведение, сопоставив позиции MouseDown и MouseUp событий, чтобы текстовое поле получало фокус только в том случае, если оба события были над ним.