Подтвердить что ты не робот

Как маскировать UIViews в iOS

Я видел похожие вопросы, но не нашел работоспособных ответов.

Я хочу замаскировать UIView с помощью серого изображения (нужно преобразовать в альфа-шкалу для маскировки). У UIView есть фон. Должно быть легко замаскировать изображение, но я хочу замаскировать любой UIView.

Любые подсказки будут оценены.

4b9b3361

Ответ 1

Я работаю над этой проблемой в течение нескольких часов и имею решение, которое, я думаю, будет делать то, что вы хотите. Во-первых, создайте свое маскирующее изображение, используя любые средства, которые, по вашему мнению, подходят. Обратите внимание, что здесь нам нужны только значения альфа, все остальные цвета будут проигнорированы, поэтому убедитесь, что используемый вами метод поддерживает альфа-значения. В этом примере я загружаюсь из файла .png, но не пытаюсь использовать файлы .jpg, так как они не имеют альфа-значений.

Затем создайте новый слой, назначьте маску его содержимому и установите этот новый слой на свой собственный слой UIView, например: вы должны обнаружить, что это маскирует UIView и все его подключенные подвью:

UIImage *_maskingImage = [UIImage imageNamed:@"mask"];
CALayer *_maskingLayer = [CALayer layer];
_maskingLayer.frame = theView.bounds;
[_maskingLayer setContents:(id)[_maskingImage CGImage]];
[theView.layer setMask:_maskingLayer];

При этом вы можете установить цвет фона UIView на все, что вам нравится, и маска будет использоваться для создания цветного фильтра.

РЕДАКТИРОВАТЬ:. Начиная с iOS8 вы можете теперь маскировать представление, просто назначив другое представление его свойству maskView. Общие правила остаются такими же, что альфа-слой maskView используется для определения непрозрачности вида, к которому он применяется.

Ответ 2

Для приложений, ориентированных на iOS 8.0+, это сработало (в этом случае, используя градиент в качестве маски). Это позволяет избежать необходимости изменять размер или положение маски.

// Add gradient mask to view
func AddGradientMask(targetView: UIView)
{
    let gradientMask = CAGradientLayer()

    gradientMask.frame = targetView.bounds
    gradientMask.colors = [UIColor.blackColor().CGColor, UIColor.clearColor().CGColor]
    gradientMask.locations = [0.8, 1.0]

    let maskView: UIView = UIView()
    maskView.layer.addSublayer(gradientMask)

    targetView.maskView = maskView 
}

В моем случае, я хочу удалить маску, как только пользователь начнет прокрутку. Это делается с помощью:

func scrollViewWillBeginDragging(scrollView: UIScrollView) {

    exerDetailsTableView.maskView = nil        
}

где представление определяется как @IBOutlet:

@IBOutlet weak var exerDetailsTableView: UITableView!

Результат:

пример скриншота

Ответ 3

Я не знаю точного кода с головы, но основная идея состоит в том, чтобы иметь два UIViews. Один UIView имел бы свойство изображения, которое было бы изображением серого масштаба, а другой UIView был бы установлен как обычно, единственное различие заключается в том, что вы разместили исходный UIView непосредственно поверх UIView, содержащего "нормальное" изображение.

Надеюсь, этого достаточно, чтобы продвинуть вашу идею дальше.