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.

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


person Joe    schedule 15.12.2009    source источник


Ответы (3)


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

Даже если:

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

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

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

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

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

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

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

OR

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

state3: неподвижные изображения

Отсюда можно рассчитать параметры анимации:

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

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

Окончательный: delta-x, delta-y, velocity-x, velocity-y, clock (), время в мс

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

--

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

person martinr    schedule 16.12.2009

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

person Visa    schedule 17.12.2009

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

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

person AndrewS    schedule 01.09.2011