Как замаскировать UIViews в iOS - PullRequest
30 голосов
/ 30 декабря 2010

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

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

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

Ответы [ 3 ]

68 голосов
/ 29 августа 2011

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

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

9 голосов
/ 10 мая 2016

Для приложений, ориентированных на 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!

Результат:

example screenshot

1 голос
/ 30 декабря 2010

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

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

...