uiscrollview и uibutton ведут себя прозрачно для сенсорных событий - PullRequest
1 голос
/ 15 декабря 2011

У меня есть пользовательский подкласс UIView и полноэкранная UIButton с фоновым изображением, как вы можете видеть на изображении, с правой стороны, есть UIView с UIImageView на нем и некоторые другие не важные метки икнопок.Важным моментом является то, что в этом UIView есть два вида прокрутки, и во время выполнения я добавляю кнопки UIB (не маленькие, 200 x 100) к этим видам прокрутки с включенной вертикальной прокруткой.Ситуация действительно очень сложная, поэтому я напишу как элементы, что происходит в разных условиях.В моем приложении есть 10 таких полных экранов в пользовательском подклассе UIView, и я использую UIPanGestureRecognizer для прокрутки от одного к другому. У меня есть веская причина не использовать для этого прокрутку.Все окна (изображение ниже, а не UIWindow) заполняют свое содержимое в цикле, поэтому работающий код для них одинаков, и все они создаются из одного и того же файла .xib.И последняя информация: большая UIB-кнопка, которая покрывает все окно, имеет действие для touchupinside, а меньшие кнопки в обзорах прокрутки имеют свои собственные селекторы touchupinside.

  • Некоторые из моих окон работают отлично, если я касаюсь где-либона экране вызывается действие кнопок большего размера, если я касаюсь и перетаскиваю, прокрутка работает и я перехожу к следующему / предыдущему окну, если я касаюсь меньших кнопок в просмотрах прокрутки, их действия запускаются и, наконец, я могу прекрасно прокручивать в этихкнопки.
  • В некоторых из моих окон, когда я пытаюсь прокрутить просмотры прокрутки, большие окна pangesturerecognizer ловят это событие, а не маленькие прокрутки, и если я касаюсь маленькой кнопки в этом представлении прокрутки, событие большего размерасработал (он проходит через uibutton> uiscrollview> uiimageview> uiview к uibutton на кнопке, как будто они не существуют)
  • если я заменим правый контейнерный вид на какую-то другую позицию на большом uibutton, он работает случайным образом илинетt, иногда одно из представлений прокрутки работает хорошо, а другое - нет.
  • оно имеет согласованное поведение, если в одной позиции оно работает, оно всегда работает, а если нет, то никогда не работает.
  • Опять же, для всех представлений и подклассов включено взаимодействие с пользователем. Да, обратное уже невозможно, поскольку поведение изменяется только в соответствии с положением представления контейнера на большой uibutton, а также в соответствии с фоновым изображением больших uibuttons.
  • Я поместил метод touchesBegan только для целей тестирования, когда касания не работают должным образом, событие, запускаемое с помощью touch.view, является контейнером большой кнопки, даже если я касаюсь маленькой кнопки в пределах прокрутки..

Я уже потратил на это два дня, но безрезультатно. Что может вызвать такое поведение?

РЕДАКТИРОВАТЬ: После комментария Крумелура я изменил фокус с конфигурации этихпредставления к анимации, которые я даю контейнерам, и я заметил, что проблема заключается ванимации, я добавляю часть кода, которая анимирует все десять окон и ведет себя как пользовательский вид прокрутки.Все окна имеют свой собственный класс слоев, и когда я ловлю распознаватель пангестера, я перемещаю окна на экране с помощью следующего кода.элементы в этом коде это массив, который содержит слои всех окон.Анимация вызывает такую ​​странную ситуацию, но я пока не могу понять ...

- (void)layoutSublayers {
[super layoutSublayers];

[CATransaction begin];
[CATransaction setDisableActions:YES];

float angleDelta = 2 * M_PI / [items count];
float a = angle;

for (UIBaseLayer *l in items) {

    l.position = self.position;  

    CATransform3D translation = CATransform3DMakeTranslation(cosf(a)*(radius.x), 1.0, (sinf(a)*radius.y) - radius.y*1.0);

    float dailyAngle = (M_PI_2 - a);
    CATransform3D rotation = CATransform3DMakeRotation(dailyAngle, 0, 1.0, 0);
    CATransform3D t = CATransform3DConcat(rotation, translation);
    l.transform = t;

    a += angleDelta;
}
[CATransaction commit];}

http://img836.imageshack.us/img836/296/screenshot20111215at013.png

Ответы [ 2 ]

1 голос
/ 14 июня 2012

bringSubviewToFront не работал надежно на 5.0 (на 5.1 взлом не требовался)

Мне пришлось добавить более прозрачный UIButton вокруг кнопки, которая вела себя так, как будто она была отключена, чтобы исправить этона iOS до 5.1.

0 голосов
/ 29 декабря 2011

Наконец-то я понял, что, даже если я отправляю назад виды с настройками CATransform3DMakeTranslation и layer.zPosition, события касания идут в представлениях в соответствии с их положением кадра.Виды, которые в настоящее время даже не видны (наложены другими), все еще ловят прикосновения.Написание только одной строки кода ([self.superview bringSubviewToFront:self]) для представления, отображаемого в данный момент на экране, решило проблему.

Для проверки этого и понимания того, о чем я говорю, я сделал простое тестовое приложение, которое имееттолько две кнопки на нем.
Синие и желтые кнопки. Синяя кнопка накладывается на желтую кнопку, так что вы можете видеть только синюю в начале.
На внутренней части кода для синей кнопки, я простоотправить его обратно с buttons.layer.zPosition = -1.После этого на экране не остается видимой части синей кнопки, вместо этого я вижу только желтую кнопку, но когда я касаюсь желтой кнопки (или, кажется, я касаюсь ее), синие кнопки остаются внутри кода.

Я не уверен, является ли это желаемой логикой, но она не кажется мне разумной.

Как я упоминал выше, запись [blueButton.superview sendSubviewToBack:blueButton] при установке его слоев zPosition в -1 работает как положено.

...