簡體   English   中英

如何在 iOS 中屏蔽 UIViews

[英]How to mask UIViews in iOS

我見過類似的問題,但還沒有找到可行的答案。

我想使用灰色圖像屏蔽 UIView(需要轉換為 alpha 比例進行屏蔽)。 UIView 有背景。 屏蔽圖像應該很容易,但我想屏蔽任何 UIView。

任何線索將不勝感激。

我已經在這個問題上工作了幾個小時,並且有一個我認為可以滿足您要求的解決方案。 首先,使用您認為合適的任何方式創建您的遮罩圖像。 請注意,這里我們只需要 alpha 值,所有其他顏色都將被忽略,因此請確保您使用的方法支持 alpha 值。 在本例中,我從 .png 文件加載,但不要嘗試使用 .jpg 文件,因為它們沒有 alpha 值。

接下來,創建一個新層,為它的內容分配遮罩,並將這個新層設置為您的 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 的 alpha 層用於確定它所應用到的視圖的不透明度。

對於面向 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!

結果:

示例截圖

我不知道我腦子里的確切代碼,但基本的想法是有兩個 UIViews。 一個 UIView 會將它的圖像屬性設置為灰度圖像,而另一個 UIView 將像往常一樣設置,唯一的區別是您將初始 UIView 直接放置在包含“正常”圖像的 UIView 之上。

我希望這足以讓你的想法更進一步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM