2016-06-30 81 views
3

我想將聊天泡泡遮罩應用於圖像視圖,並且我希望將遮罩圖像縮放以適合圖像視圖的框架。這是我用來創建和敷面膜代碼:如何防止UIImageView遮罩的裁剪

let mask = CALayer() 
let maskImage = UIImage(named: "chatGif")! 
mask.contents = maskImage.CGImage 
mask.frame = CGRectMake(0, 0, imageView.frame.width, imageView.frame.height) 
imageView.layer.mask = mask 
imageView.layer.masksToBounds = true 

這是我的面具:

enter image description here

然而,這是我所得到的:

enter image description here

當我添加切片蒙版圖像(即創建可調整大小的帽子插圖)我得到這個:

enter image description here

我犯了一個很小的項目,證明這個問題,並把它here

我沒有從根本上理解,爲什麼我的掩模圖像的右邊和底邊越來越切出的視圖。蒙版的邊框和邊界與圖像視圖相匹配,用於蒙版的圖像實際上比圖像視圖更小,因此如果有任何內容,我希望它不會覆蓋整個內容,而不是部分修剪。

有人能解釋一下這裏發生了什麼嗎?我如何防止這種行爲?

編輯:我一直是這樣一些玩耍,結果使一些更有意義的時候我設置了蒙版的尺寸相匹配,像這樣的maskImage大小:

let mask = CALayer() 
let maskImage = UIImage(named: "chatGif")! 
mask.contents = maskImage.CGImage 
mask.frame = CGRectMake(0, 0, maskImage.size.width, maskImage.size.height) 
imageView.layer.mask = mask 
imageView.layer.masksToBounds = true 

這給了我:

enter image description here

或者在光罩資產切片,我得到了J.Hunter的答案圖像。這仍然不是我想要的,因爲面具沒有被拉伸以填充imageView,並且圍繞雙方的很大一部分被掩蓋掉了,這不應該是,但我至少可以理解在這種情況下發生的事情。我將面罩的框架設置爲比imageView的框架更小的尺寸,因此它當然不會填滿整個區域。

但是我期望設置掩碼的框架與imageView匹配的框架將使掩碼的右邊緣和底邊緣在最後一個屏幕截圖中與imageView的右邊緣和底邊緣對齊。如果我打印出口罩的框架,邊界和contentsRect,它們正是我所期望的:框架和邊界匹配imageViewcontentsRect(0.0, 0.0, 1.0, 1.0)。我的理解是,CALayer將基於contentsRect顯示其部分內容,因此除非該rect小於1.0x1.0,否則應顯示整個內容圖像。對?但爲什麼這不是我所看到的?

+0

也許[這個線程](http://stackoverflow.com/questions/5757386/how-to-mask-an-uiimageview)可以幫助你 –

+0

不幸的是,我不能使用'CGImageCreateWithMask'方法,因爲在我的實際項目中我我正在使用'FLAnimatedImageView'來顯示gif,所以掩碼需要在'UIImageView'層,而不是'UIImage'層。 – NewShelbyWoo

回答

0

好吧,我終於想通發生了什麼事情有些不對勁。我添加了相同的調試打印語句到我在實際項目中放入的示例項目中,並發現在設置遮罩時的框架比我預期的大得多,而不是其最終顯示大小。這是有道理的,因爲在示例項目中,我在viewDidLoad中設置了掩碼,在任何子視圖佈局之前。

在我的實際項目打印出值,因爲我UIImageView處於UITableViewCell時,我不知道這是事實,所以它的未初始化的大小是一樣的故事板佔位符的大小,這是不比最終尺寸大得多,所以它沒有讀得太明顯。

現在,如果我只能得到我生命中最後4個小時的時間。

編輯:澄清,最初的代碼工作正常,如果它在圖像視圖後運行它最終佈局大小設置。所以你應該在viewDidLayoutSubviews中設置掩碼,或者如果它是一個表/集合單元格,你可以檢查layoutSubviews中的框架大小是否已經改變。

+0

我正面臨同樣的問題,你做了什麼來解決它? –

+0

我更新了我的解決方案。您只需在設置最終大小後運行初始代碼。 – NewShelbyWoo

+0

謝謝,當我在uicollectionViewCell中的imageView上應用mask時遇到了同樣的問題,我設法通過在cellForItemAt函數中調用cell.setNeedsLayout() cell.layoutIfNeeded()並在我的自定義單元格中重寫layoutIfNeeded –

0

我下載的演示項目和重寫一些像這樣的代碼:

覆蓋FUNC viewDidLoad中(){ 超。viewDidLoad中()

let mask = CALayer() 
let maskImage = UIImage(named: "chatGif")! 
print("image size is \(maskImage.size)") 
mask.contents = maskImage.CGImage 
mask.frame = CGRect(origin: CGPointZero, size: maskImage.size) 
imageView.layer.mask = mask 
imageView.layer.masksToBounds = true 

}

您maskImage的圖像尺寸爲(39.5,32.5)。它看起來像你的chatGif.png

快照 enter image description here

+0

因此,這是我在「chatGif」資產上切片的結果,這與「調用'resizableImageWithCapInsets'。當你這樣做,然後獲取maskImage的大小時,該大小是資產的最小大小。如果您查看chatGif.png文件,您可以看到它是294x174。我想要的是使面罩框架的大小與imageView框架的大小相同,並且將面罩縮放到該大小並且不大。我會用更多信息更新我的問題。 – NewShelbyWoo

+0

@NewShelbyWoo它困惑我。我用Photoshop打開chatGif.png並查看頻道,一切看起來都不錯。 –