Как я могу рисовать в области «отскока» UIScrollView?

#iphone #uiscrollview #drawrect

#iPhone #uiscrollview #drawrect

Вопрос:

У меня есть пользовательский вид, который я включаю в UIScrollView, который прокручивается по горизонтали. Вид рисует фон с линиями, простирающимися по горизонтали, и несколькими различными цветами фона. Когда я прокручиваю крайний левый угол так, что вид прокрутки «подпрыгивает», я вижу серый цвет фона. Что я хотел бы сделать, так это нарисовать дополнительные фоновые линии и цвета в этой области, чтобы казалось, что вид продолжается вечно, но я не совсем понимаю, как это сделать. Я пробовал установить для clipsToBounds значение NO для всех видов и рисовать в области за пределами вида, но, похоже, это не работает. Как я могу рисовать в этой области?

Комментарии:

1. Вы пробовали создать свой собственный scrollview (подкласс UIScrollView) и реализовать drawRect 😕 Может быть сложно совместить это с оригинальной реализацией чертежа, но именно так я бы попробовал в первую очередь.

Ответ №1:

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

     CGFloat scrollViewHeight = 300;
    CGFloat preferredWidthOfContent = 500;
    CGFloat gutterMargin = self.bounds.size.width / 2;
    scrollView.frame = CGRectMake(-1 * gutterMargin, 0, self.bounds.size.width, scrollViewHeight)
    scrollView.contentSize = CGSizeMake(preferredWidthOfContent   2 * gutterMargin, scrollViewHeight);
    contentView.frame = CGRectMake(0, 0, preferredWidthOfContent   2 * gutterMargin, scrollViewHeight);
  

Представление содержимого должно знать о ширине поля желоба, а затем отображать фактическое содержимое в правильном месте на основе этого. Когда ScrollView «отскакивает», фактически отображается оставшаяся часть представления содержимого.

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

Ответ №2:

Если вы рисуете свои линии в drawRect: методе, нет способа вывести их за пределы вида. Свойство clipsToBounds влияет только на подвиды, поэтому теоретически вы могли бы добавить подвиды к вашему основному виду (тому, который отображает содержимое) с рамкой, которая простирается справа от вашего вида, и нарисовать линии в этом подвиде.

Другой вариант — добавить вложенный вид в вид прокрутки и разместить его справа от вашего основного вида. Затем нарисуйте линии в этом вложенном представлении. Вид прокрутки все равно будет отскакивать, поскольку ему все равно, есть ли в нем еще частично видимые виды, он смотрит только на contentSize свойство, чтобы решить, когда остановить прокрутку.

Если ни один из вариантов не подходит, более подробно опишите, какие линии вы рисуете и какого вида внешнего вида вы хотели бы добиться.