iPhone SDK Cocoa Touch - передача прикосновения от родительского UIView к дочернему UIScrollview

У меня есть UIView внутри xib в IB и внутри, который представляет собой UIScrollview, который представляет собой небольшой квадрат 80x80 и динамически загружается с 8 или около того миниатюрными изображениями 80 x 80.

UIScrollview не обрезает изображения так, чтобы они расширялись с обеих сторон, так что вы можете провести пальцем влево и вправо, чтобы прокрутить выбранное изображение в центр, подкачка включена, поэтому они привязывают каждое изображение.

Я исследовал и обнаружил, что это лучший и, возможно, единственный способ сделать это.

UIScrollview находится в "контейнере" UIView по одной причине: он предназначен для получения касаний / ударов и передачи их своему потомку UIScrollview, поскольку в противном случае все касания должны были бы начинаться в небольшой области 80x80 UIScrollview, и я хочу, чтобы они быть где-нибудь вдоль ряда изображений.

Я видел пример кода где-то для этого, но просто не могу его реализовать.

Относитесь ко мне как к нубу, начиная с начала и до конца, как настроить UIView и UIScrollview в IB, чтобы разрешить передачу любых касаний, и какой код я должен поместить в куда?

UIView установлен как scroll_container, а дочерний UIScrollview - char_scroll

На данный момент у меня все работает, за исключением касаний, передаваемых от родителя к ребенку, и на данный момент касания должны всегда начинаться внутри UIScrollview (крошечная коробка 80x80 в центре), когда я хочу иметь возможность провести пальцем влево или вправо в длинном горизонтальном родительском UIView 480X80, и он по-прежнему прокручивает дочерний UIScrollview.

Надеюсь, что вы можете помочь и понять, что я имею в виду!

3 ответа

Вы можете создать подкласс UIScrollView и переопределить -pointInside:withEvent: метод. Реализация по умолчанию UIView возвращает что-то вроде CGRectContainsPoint(self.bounds, thePointToTest);. Просто проверьте более широкий прямоугольник.

То, как вы делаете это, в основном там. Я попытался создать подкласс UIView для передачи сенсорных событий, но моя первая попытка не сработала, и я обнаружил следующее: как расширить область ответа UIScrollView.

По сути, подкласс UIScrollView для расширения диапазона HitTest. У вас все еще будет UIView, но он будет пассивным.

Все мои инстинкты говорят, что это не способ сделать это!

Даже если:

(a) Документы Apple говорят, что это работает и как это сделать;

(б) и вы можете заставить работать штуковину hitTest и сделать объекты UIEvent приятными.

если бы это был я, я бы ожидал, что первое изменение, внесенное Apple в ОС, нарушит код!

Что бы я сделал, это:

  • Используйте Core Animation API.
  • Смоделируйте замедление изображений, когда движущийся палец отпускает их самостоятельно
  • Попробуйте разные скорости замедления и разные алгоритмы привязки (попробуйте с отскоком и без него), пока не найдете приемлемый пользовательский опыт (попробуйте прототипирование в DHTML, прежде чем переходить в Cocoa Touch)
  • Прекратите использовать UIScrollView и используйте просто UIView

Вам нужно моделировать в вашем штате:

state1: изменение положения (delta x,delta y), запрошенное пользователем на этом касании

ИЛИ ЖЕ

state2: время пальца (дельта х, дельта у) и (скорость х, скорость у) и часы (), когда изображение отпущено, если изображение все еще замедляется и не останавливается

state3: изображения стационарные

Из этого можно рассчитать параметры анимации:

По умолчанию: дельта-х, дельта-у, скорость-х, скорость-у, часы () время в мс

Если поддерживается подпрыгивание: любые промежуточные точки поворота

Конечный: дельта-х, дельта-у, скорость-х, скорость-у, время часов () в мс

И из этих параметров анимации можно вычислить набор ключевых кадров анимации и передать их в Core Animation. (Большое количество ключевых кадров необходимо для плавного показа пользовательского замедления во время анимации.)

-

Какие ссылки вы нашли, чтобы сказать, что вы предлагаете, это лучший способ?

Другие вопросы по тегам