Почему мой UIScrollView не прокручивается в этой ячейке?

Я создаю UIScrollView внутри UITableViewCell, чтобы ячейка могла прокручиваться влево и вправо. Я установил вид прокрутки в раскадровке без каких-либо ограничений AutoLayout и создал для него выход. Я помещаю UILabel внутри представления прокрутки, а затем устанавливаю contentSize прокрутки в коде.

Но когда я запускаю его в симуляторе, я совершенно не могу прокрутить ячейку влево или вправо. Что я делаю неправильно?

Вот небольшой проект, который я создал, демонстрируя это в простом случае: http://cl.ly/0r2f0K1K3L1s

Я бы включил больше кода, но на самом деле это не намного больше, чем то, что я обрисовал в общих чертах, так как большая часть этого делается в раскадровке. Есть ли что-то особенное в использовании раскадровки и прокрутки?


person Community    schedule 27.03.2014    source источник


Ответы (3)


Проблема в том, что вы используете раскадровку с включенной автоматической компоновкой в ​​качестве источника ячейки прототипа с прокруткой внутри нее. Следовательно, ваша попытка вручную установить размер содержимого прокрутки не удалась. Либо используйте внутренние ограничения для установки размера содержимого, либо создайте и настройте вид прокрутки и его содержимое полностью в коде, чтобы к ним не применялся автоматический макет, либо используйте отдельный .xib в качестве источника вашей ячейки (так что там можно отключить автоматическую раскладку).

Мне удалось заставить ваше представление прокрутки работать, используя ограничения в вашей раскадровке. Мне пришлось указать как вид прокрутки, так и соответствующие ограничения метки.

person matt    schedule 27.03.2014
comment
Как будут выглядеть эти ограничения, которые вы установите? - person ; 27.03.2014
comment
Вы понимаете, как работают ограничения для установки размера содержимого прокрутки? - person matt; 27.03.2014
comment
Заднее правое ограничение от метки должно быть большим, чтобы представление прокрутки можно было прокручивать влево. - person matt; 27.03.2014
comment
Ах ха. Поэтому я воссоздал его здесь. Я понимаю, что размер контента расшифровывается из ограничений подвидов внутри него. Однако я не могу на всю жизнь установить желаемые ограничения. То, что я пытаюсь сделать, имеет ширину 960 pt, чтобы я мог сдвинуть ее полностью влево или вправо. (960 = 3 * 320). Независимо от того, какие ограничения я установил, кажется, что он создал неоднозначный размер содержимого для представления прокрутки... (Да, я пытаюсь сделать это с представлением, чтобы я мог четко охватывать подпредставления, я надеюсь, что это не так. ) - person ; 27.03.2014
comment
неоднозначный размер содержимого для представления прокрутки Предположим, что метка — это единственное, что находится внутри представления прокрутки. Затем у вас должны быть ограничения от него к просмотру прокрутки на всех четырех сторонах. Вы описываете размер контента с этими ограничениями. У того, что справа, должно быть установлено большое число constant, хотя на самом деле для этого нет места в представлении, потому что вы хотите сдвинуть размер содержимого вправо, чтобы вы могли прокручивать влево. - person matt; 29.03.2014
comment
Или, если ваша иерархия представляет собой представление прокрутки -> представление содержимого -> метка, то вы должны сделать это с представлением содержимого. Но в этом случае вы должны указать все четыре стороны, а также высоту и ширину представления содержимого, потому что, в отличие от метки, оно не имеет собственного размера. - person matt; 29.03.2014
comment
Загрузите этот пример из моей книги: github.com/mattneub /Programming-iOS-Book-Examples/tree/master/ У него нет кода, но он полностью настраивает представление прокрутки в раскадровке, включая размер содержимого, чтобы его можно было прокручивать. - person matt; 29.03.2014
comment
Если вы хотите иметь возможность прокручивать влево, зачем вам увеличивать размер содержимого вправо? Разве это не создает размер контента справа, который мы не можем видеть, поэтому мы прокручиваем его? И я думаю, что понимаю, что вы говорите о просмотре контента, и этот пример очень помог, но возьмем этот пример, который я быстро создан. Это розовый контент, который я хочу прокручивать влево или вправо. Кажется, я установил все необходимые мне ограничения и установил высоту такой же, как вид прокрутки, но он все еще жалуется и начинает плохо позиционироваться. Что я делаю не так в этом проекте? - person ; 31.03.2014
comment
@ Aloha64 Aloha64, если вместо этого вы разместите свой пример на github, я разветвлю его, попытаюсь исправить и отправлю вам запрос на включение, чтобы вы могли изучить изменения. - person matt; 31.03.2014
comment
@ Aloha64 Aloha64 Да, именно, вы ДЕЙСТВИТЕЛЬНО хотите перейти к нему! Вы хотите прокручивать влево, а не вправо. Итак, ваш контент выглядит так: |-label--------| Большое пространство находится справа, поэтому метку можно переместить влево. Каналы — это края прокручиваемого контента. Пространство справа должно быть шире, чем расстояние до края прокрутки, иначе содержимое не будет прокручиваться (именно так работают прокрутки!) - person matt; 31.03.2014
comment
О, теперь я полностью понимаю. Я перепутал направления в голове. Вот репозиторий GitHub: github.com/aloha64/ScrollableTableViewCell (большое спасибо.) - person ; 31.03.2014
comment
@ Aloha64 Нет, я ничего не вижу. github.com/aloha64/ScrollableTableViewCell по сути является пустым проектом. У него нет табличных представлений, нет ограничений, нет ничего. - person matt; 31.03.2014
comment
Это действительно неловко. Извиняюсь. Исправлено сейчас. - person ; 01.04.2014
comment
Хорошо, @Aloha64, я исправил твой пример и создал запрос на вытягивание. Извлеките изменения и объедините их, а затем загрузите и запустите пример. Вы увидите, что скользящее представление теперь можно двигать (и вас даже ждет небольшой сюрприз, когда вы это сделаете). Код не использовался; все, что я сделал, это немного подправил раскадровку. - person matt; 01.04.2014
comment
Спасибо, Мэтт, это действительно потрясающе. Можно ли заставить его прокручивать как вправо , так и влево? - person ; 01.04.2014
comment
Ну конечно; естественно. Посмотрите, что я сделал справа (в конце) и сделайте то же слева (впереди). Подумай о том, что я тебе показываю и что я тебе говорил. - person matt; 01.04.2014
comment
Извините, все еще привыкаю к ​​этому. Большое спасибо, огромная помощь и феноменальная книга. - person ; 03.04.2014
comment
Га, последние вопросы. Есть ли что-то большее, чем просто сделать ведущее ограничение ненулевым? Если я увеличу его, чтобы добавить пространство с другой стороны, это сдвинет вид с центра. Наконец, можно ли явно не устанавливать высоту, но она должна быть равна высоте прокрутки? - person ; 03.04.2014

Если кто-то все еще сталкивается с проблемой, попробуйте это.

Если вы используете пользовательский класс ячеек

пытаться

self.contentView.isUserInteractionEnabled = true

or

cell.contentView.isUserInteractionEnabled = true
person George    schedule 21.02.2021

Перейдите в Раскадровка-> Удалить с помощью AutoLayout. Ваша ячейка может прокручиваться. Вы не устанавливаете никаких ограничений, но системное ограничение будет срабатывать во время выполнения.

person HoanNguyen    schedule 27.03.2014
comment
Что делать, если я хочу автоматический макет для других ячеек? - person ; 27.03.2014
comment
включите автомакет, найдите эффективный способ установить константу автомакета для вашей ячейки. Задайте другой вопрос и отметьте правильный ответ. - person HoanNguyen; 27.03.2014