UIScrollView не отвечает на жесты - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть UIScrollView, который представляет собой информационную панель в основном с соответствующей информацией для пользователя.Он имеет пейджер внизу и содержит три UIViews на данный момент.

Я использовал для установки различных представлений с CGRect в качестве рамки, устанавливая смещение по x ширины UIScrollView * номер страницы.Это работало нормально, но было трудно заставить UIScrollView исчезнуть при прокрутке внизу UITableView.

Я сейчас использую AutoLayout с ограничениями для отображения информации, которая работает нормально.Тем не менее, мой UIScrollView больше не прокручивается.Он не отвечает ни на какие жесты, которые я выполняю.Тем не менее, он реагирует на нажатия в пейджере, который показывает, что смещения и ограничения верны, я просто не могу прокрутить его.Взгляните:

Example

Мой UIScrollView составлен так:

var dashboardView: UIScrollView = {

    let dashboardView = UIScrollView()
    dashboardView.translatesAutoresizingMaskIntoConstraints = false
    dashboardView.backgroundColor = UIColor.clear
    dashboardView.layer.masksToBounds = true
    dashboardView.layer.cornerRadius = 10
    dashboardView.isPagingEnabled = true
    dashboardView.showsHorizontalScrollIndicator = false
    dashboardView.showsVerticalScrollIndicator = false
    dashboardView.alwaysBounceHorizontal = false
    dashboardView.alwaysBounceVertical = false
    return dashboardView

}()

Затем я устанавливаю различные виды следующим образом::

for index in 0..<3 {

    let currentDash = UIView()
    currentDash.backgroundColor = UIColor.lightGray
    currentDash.layer.cornerRadius = 10
    currentDash.layer.masksToBounds = false
    currentDash.translatesAutoresizingMaskIntoConstraints = false
    currentDash.isUserInteractionEnabled = false
    dashboardView.addSubview(currentDash)
    currentDash.topAnchor.constraint(equalTo: dashboardView.topAnchor).isActive = true
    currentDash.bottomAnchor.constraint(equalTo: dashboardView.bottomAnchor).isActive = true
    currentDash.leadingAnchor.constraint(equalTo: dashboardView.leadingAnchor, constant: dashboardWidth * CGFloat(index)).isActive = true
    currentDash.trailingAnchor.constraint(equalTo: dashboardView.leadingAnchor, constant: (dashboardWidth * CGFloat(index)) + dashboardWidth).isActive = true
    currentDash.widthAnchor.constraint(equalToConstant: dashboardWidth).isActive = true
    currentDash.heightAnchor.constraint(equalToConstant: dashboardHeight).isActive = true

}

Когда я удаляю ограничения (AutoLayout) и устанавливаю его с кадрами, он работает отлично, например так:

dashFrame.origin.x = dashboardWidth * CGFloat(index)
dashFrame.size = CGSize(width: dashboardWidth, height: dashboardHeight)
let currentDash = UIView(frame: dashFrame)

Но тогда, из-за установки кадра, представлениене прокручивается вверх, как я, поэтому я хочу использовать AutoLayout.

Есть идеи или предложения относительно того, что я делаю неправильно?Мой метод ScrollViewDidScroll () просто не вызывается, потому что простая печать ничего не возвращает в моей консоли.

Я попытался установить для свойства isUserInteractionEnabled значение false в currentDash UIView, что не удалось.Я также попытался удалить все ограничения по отдельности, некоторые вместе и т. Д. - но это также не работает - мне нужны как минимум topAnchor, bottomAnchor, heightAnchor и widthAnchor.

О, и, конечно же, яустановите свойство contentSize:

dashboardView.contentSize = CGSize(width: dashboardWidth * CGFloat(dashboardPager.numberOfPages), height: dashboardHeight)

Будем весьма благодарны за любые предложения или подсказки в отношении правильного ответа.Спасибо!

РЕДАКТИРОВАТЬ: я также установил ограничения для самого UIScrollView:

dashboardView.topAnchor.constraint(equalTo: dashboardBG.topAnchor).isActive = true
dashboardView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: normalSpacing).isActive = true
dashboardView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -normalSpacing).isActive = true
dashboardView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
dashboardView.heightAnchor.constraint(equalToConstant: dashboardHeight).isActive = true

dashboardView.delegate = self

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Я, в конце концов, понял это благодаря ответу Ш_Хана.Я сохранил исходный код, но удалил трейлинг-якорь для всех индексов и добавил его только к последнему индексу.

for index in 0..<3 {

    let currentDash = UIView()
    currentDash.backgroundColor = UIColor.lightGray
    currentDash.layer.cornerRadius = 10
    currentDash.layer.masksToBounds = false
    currentDash.translatesAutoresizingMaskIntoConstraints = false
    currentDash.isUserInteractionEnabled = false
    dashboardView.addSubview(currentDash)
    currentDash.topAnchor.constraint(equalTo: dashboardView.topAnchor).isActive = true
    currentDash.bottomAnchor.constraint(equalTo: dashboardView.bottomAnchor).isActive = true
    currentDash.leadingAnchor.constraint(equalTo: dashboardView.leadingAnchor, constant: dashboardWidth * CGFloat(index)).isActive = true
    currentDash.widthAnchor.constraint(equalToConstant: dashboardWidth).isActive = true
    currentDash.heightAnchor.constraint(equalToConstant: dashboardHeight).isActive = true 
    if index == 2 {
        currentDash.trailingAnchor.constraint(equalTo: dashboardView.trailingAnchor).isActive = true
    } 
}

Спасибо за помощь!

0 голосов
/ 21 декабря 2018

Проблема здесь

currentDash.leadingAnchor.constraint(equalTo: dashboardView.leadingAnchor, constant: dashboardWidth * CGFloat(index)).isActive = true
currentDash.trailingAnchor.constraint(equalTo: dashboardView.leadingAnchor, constant: (dashboardWidth * CGFloat(index)) + dashboardWidth).isActive = true

1 - Что касается начала представлений, то начало первого представления должно быть закреплено на scrollView, а начало второго представления - за последним предыдущим.и так далее, так что

if index == 0{

   // make leading with scrolview leading
else
{

   // make leading with prevView trailing
}

Итак, создайте переменную, инициированную с помощью scrollView, и измените конец цикла for

2 - Что касается трейлинга, к последнему трейлингу будет прикреплен только последний трейлинг вида.прокрутка

if index == 2 { // last 

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