Как реализовать «селективный» clipToBounds для UIView, то есть обрезать некоторые подпредставления, но не другие - PullRequest
1 голос
/ 05 февраля 2011

Я хочу обрезать некоторые подпредставления представления в пределах границ представления, а не другие.Любые идеи относительно того, как приступить к реализации этого быстро и легко.

Для контекста: у меня есть UIScrollView с набором подпредставлений, которые можно перетащить за пределы представления.При перетаскивании их из вида, я хочу, чтобы подпредставление НЕ БЫЛО ОСТАНОВЛЕНО.В противном случае я хочу, чтобы они были обрезаны.

  • Если я выполню [view setClipToBounds: YES] перед размещением подпредставлений, все будет хорошо, пока я не буду перетаскивать подпредставление.И если, когда начинается перетаскивание, я выполняю [view setClipToBounds: NO] at touchesBegan: withEvent и [view setClipToBounds: YES] at touchesEnded: withEvent :, тогда скроллвид перерисовывается во время перетаскивания, поэтому появляются ранее вырезанные подпредставления.
  • Один из подходов, которые я попробовал, но не получил работы, - это перемещение подпредставления из просмотра прокрутки в супервид просмотра прокрутки, как только начинается перетаскивание (в элементах touchviewBegan: withEvent).Однако, когда вид перемещается из одного вида в другой, он теряет след касаний и перетаскивание заканчивается.

1 Ответ

2 голосов
/ 05 февраля 2011

Я решил свою проблему следующим образом. Когда подпредставление прокрутки получает touchesBegan: withEvent: я устанавливаю альфа этого подпредставления на 0.0. Затем я создаю идентичное подпредставление и добавляю его в суперпредставление прокрутки. Для начальной позиции я использую следующее:

CGPoint newOrigin = [self origin];
newOrigin.x = newOrigin.x + [[self superview] origin].x;
newOrigin.y = newOrigin.y + [[self superview] origin].y - [(UIScrollView*)[self superview] contentOffset].y;
[newSubview setOrigin: newOrigin];  // setOrigin is defined in a category on UIView - it does what you'd expect

(Примечание: если вы не компенсируете смещение содержимого прокрутки, вы можете получить удивительное поведение ...)

Мой метод touchesMoved: withEvent перемещает подпредставление (как обычно для реализации перетаскивания), а затем touchesEnded: withEvent удаляет дополнительное подпредставление из суперпредставления прокрутки и устанавливает альфа начального подпредставления обратно в 1,0. Так что, по сути, дополнительное подпредставление копает невидимое подпредставление.

...