Установка маски свойства представления контроллера представления и подпредставления представления таблицы этого представления приводит к двум маскам, которые выглядят по-разному - PullRequest
0 голосов
/ 21 мая 2019

Я использую следующий код для установки маски представления контроллера вида:

view.mask = UIView(frame: view.frame)
view.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
view.isUserInteractionEnabled = false

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

scrollView.mask = UIView(frame: scrollView.frame)
scrollView.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
scrollView.isUserInteractionEnabled = false

Хотя маски выглядят совершенно по-другому (маска вида намного темнее, чем у scrollView. Кто-нибудь знает, почему это может произойти?

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Пара наблюдений:

  1. Вы не хотите использовать frame вида при установке frame маски.Используйте взамен bounds.

    Маска вида должна быть помещена в систему координат вида, которой является bounds, а frame - нет.frame определяется в системе координат суперпредставления.Итак, вы хотите:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        view.mask = UIView(frame: view.bounds)
        view.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
    }        
    

    Если ваше представление имеет происхождение в 0, 0, вы можете не заметить разницу между использованием frame и bounds, но первое неверно и приведет кк проблемам, если представление когда-либо не находится в 0, 0.

  2. Обратите внимание, я устанавливаю это в viewDidLayoutSubviews, чтобы, если что-то вызывает представлениеразмер, чтобы изменить, маска обновляется соответственно.Возможно, вы тоже этим занимаетесь, но я упомяну это просто для ясности.Если вам случалось делать такие вещи в подклассе UIView (а не в подклассе UIViewController), вы бы сделали это вместо layoutSubviews.

  3. mask прокрутки просмотра прокрутки с прокруткой просмотра.Таким образом, если высота этой маски равна высоте bounds представления прокрутки, то после прокрутки маска представления прокрутки прокручивается вверх, и все, что находится за пределами frame маски, вообще не будет видно.

    Таким образом, вы можете установить size маски frame как contentSize вида прокрутки.Или я бы лично добавил маску к суперпредставлению вида прокрутки, а не к самому виду прокрутки) (чтобы маска не прокручивалась).Но установка маски для вида с прокруткой, равной размеру bounds / frame видов прокрутки, а не contentSize, не даст желаемого результата.

  4. Это не такясно из вашего вопроса, но являются ли эти два родственных / смежных взгляда или один является подвидом другого?Если последнее, то это может быть проблематично.Если вы установите маску (с альфа-значением ниже 1) для вида, эта маска также будет применена ко всем его подпредставлениям.Таким образом, если представление с альфа-маской 0,25 имеет подпредставление, которое имеет собственную альфа-маску 0,25, фактически это подпредставление будет отображаться с альфа-версией 0,0625.

Но здесь есть текстовое представление ипредставление прокрутки с меткой, оба с альфа-25% -ным содержанием, не являющимся подвидом другого, и оно отлично работает:

enter image description here

Это было сказаноЯ бы посоветовал добавить альфу к общему суперпредставлению, решить проблемы с прокруткой и масками на масках.

0 голосов
/ 21 мая 2019

В приведенном выше вопросе вы используете view, который добавлен по умолчанию, но если вы хотите применить свою маску в своем scrollView, который устарел, вам нужно добавить, addsubview метод, как я реализовал ниже, попробуйте это

scrollview.mask = UIView(frame: scrollview.frame)
scrollview.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
scrollview.isUserInteractionEnabled = false
scrollview.addSubview(scrollview.mask!)
...