2014-12-30 6 views
3

Я программирую в Swift. Я хочу замаскировать изображение с помощью CALayer и UIImage. Я создаю изображение маски. Созданное изображение маски является UIImage и отлично работает, когда я сам его рассматриваю. Но когда я использую его как маску, весь экран становится белым. Я подозреваю, что моя проблема заключается в настройке объекта CALayer. Буду признателен за вашу помощь. Благодаря!Маскирование изображения в Swift с использованием CALayer и UIImage

class ViewController: UIViewController { 

    @IBOutlet weak var imageView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     var maskImageSize = CGSizeMake(self.imageView.frame.width, self.imageView.frame.height) 
     UIGraphicsBeginImageContextWithOptions(maskImageSize, false, 0.0) 

     var color = UIColor(white: 1.0, alpha: 1.0) 
     color.setFill() 
     var rect = CGRectMake(0, 0, self.imageView.frame.width, self.imageView.frame.height) 
     UIRectFill(rect) 

     color = UIColor(white: 0.0, alpha: 1.0) 
     color.setFill() 
     rect = CGRectMake((self.imageView.frame.width/2)-100, (self.imageView.frame.height/2)-100, 200, 200) 
     UIRectFill(rect) 

     var maskImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     var maskLayer = CALayer() 
     maskLayer.contents = maskImage 
     maskLayer.contentsRect = CGRectMake(0, 0, self.imageView.bounds.width, self.imageView.bounds.height) 


     self.imageView.image = UIImage(named: "pictobemasked.png") 

     self.imageView.layer.mask = maskLayer; 
    } 

} 

ответ

11

К сожалению, вы задали свой вопрос довольно плохо - вы не сказали, что именно вы на самом деле пытаетесь сделать! Однако, похоже, вы пытаетесь пробить прямоугольное отверстие в изображении, используя маску. Если это так, ваш код имеет как минимум три огромных недостатка.

  • Одна из причин, по которой ваш код не работает, заключается в том, что маска основана на прозрачности, а не на цвете. Вы используете непрозрачный белый и непрозрачный черный, которые являются непрозрачными, поэтому нет никакой разницы. Вы нужны ваши два цвета, чтобы быть похожим на это:

    var color = UIColor(white: 1.0, alpha: 1.0) 
    // ... and then, later ... 
    color = UIColor(white: 1.0, alpha: 0.0) 
    
  • Вторая проблема заключается в том, что ваш слой не имеет размера. Вы должны дать ему одно:

    var maskLayer = CALayer() 
    maskLayer.frame = CGRectMake(
        0, 0, self.imageView.bounds.width, self.imageView.bounds.height) 
    
  • Третья и самая большая проблема в том, что ваша маска изображение никогда не попасть в маску слоя, потому что вы забыли извлечь его CGImage:

    maskLayer.contents = maskImage.CGImage 
    

Этот последний действительно убийца, потому что если вы установите contents на UIImage без извлечения его CGImage, изображение не получится бесшумно, чтобы попасть в слой. Нет сообщения об ошибке, без сбоев - и никакого изображения.

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

+0

Спасибо за ваш ответ. Все три точки верны. У меня все еще есть проблема, которая должна быть связана с калибровкой и позиционированием объекта CALayer. Я новичок в этой теме. Я отправлю еще один комментарий, в котором будет изложена проблема и возможные проблемы с исправлением или более. Благодаря! – user2732722

+0

Задайте новый вопрос! Если вы заметите меня с комментарием, я попытаюсь посмотреть на него. - Обратите внимание, что вы не допустили бы каких-либо ошибок, если бы вы прочитали главу моей книги о слоях: http://www.apeth.com/iOSBook/ch16.html. Все три пункта четко и решительно упомянуты. – matt

+0

Спасибо за ссылку на книгу. Я признаю, что сначала мне нужно учиться основательно. У меня почти время, и поэтому я начал взламывать. Моя проблема в том, что я не знаю, как выровнять маску на исходном изображении. Я хочу показать изображение произвольного размера. Я генерирую содержимое маски программно так, чтобы он был того же размера, что и изображение. Это отверстие в середине маски - это просто тест. После того, как я получу этот запуск, я хочу иметь более сложную маску, которая должна покрыть весь образ. Я был бы признателен за любую помощь, чтобы получить право на выравнивание. Благодаря! – user2732722