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