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

У меня есть 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 ]

0 голосов
/ 18 декабря 2009

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

0 голосов
/ 01 сентября 2011

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

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

0 голосов
/ 16 декабря 2009

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

Даже если:

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

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

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

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

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

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

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

OR

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

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

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

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

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

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

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

-

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...