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. (Большое количество ключевых кадров необходимо для плавного показа пользовательского замедления во время анимации.)
-
Какие ссылки вы нашли, чтобы сказать, что вы предлагаете, это лучший способ?