2010-12-30 11 views
28

मैंने इसी तरह के प्रश्न देखे हैं, लेकिन काम करने योग्य जवाब नहीं मिला है।आईओएस में UIViews को मुखौटा कैसे करें

मैं एक ग्रे छवि का उपयोग करके एक UIView मुखौटा करना चाहता हूं (मास्किंग के लिए अल्फा स्केल में कनवर्ट करने की आवश्यकता है)। UIView पृष्ठभूमि है। किसी छवि को मुखौटा करना आसान होना चाहिए, लेकिन मैं किसी भी UIView को मुखौटा करना चाहता हूं।

किसी भी सुराग की सराहना की जाएगी।

उत्तर

67

मैं इस समस्या पर कुछ घंटों तक काम कर रहा हूं और एक समाधान है जो मुझे लगता है कि आप जो चाहते हैं वह करेंगे। सबसे पहले, जो भी आप फिट देखते हैं उसका उपयोग करके अपनी मास्किंग छवि बनाएं। ध्यान दें कि हमें केवल अल्फा मानों की आवश्यकता है, अन्य सभी रंगों को अनदेखा कर दिया जाएगा, इसलिए सुनिश्चित करें कि आपके द्वारा उपयोग की जाने वाली विधि अल्फा मानों का समर्थन करती है। इस उदाहरण में मैं एक .png फ़ाइल से लोड कर रहा हूं, लेकिन इसे .jpg फ़ाइलों के साथ आज़माएं क्योंकि उनके पास अल्फा मान नहीं हैं।

इसके बाद, एक नई परत बनाने इसकी सामग्री के लिए अपने मुखौटा प्रदान करेगा और आपके UIView की अपनी परत को यह नई परत निर्धारित करते हैं, तो जैसे: आप पाएँगे कि यह मास्क UIView और उसके सभी संलग्न subviews:

UIImage *_maskingImage = [UIImage imageNamed:@"mask"]; 
CALayer *_maskingLayer = [CALayer layer]; 
_maskingLayer.frame = theView.bounds; 
[_maskingLayer setContents:(id)[_maskingImage CGImage]]; 
[theView.layer setMask:_maskingLayer]; 

ऐसा करने के साथ, आप जो भी चाहें उसे UIView का पृष्ठभूमि रंग सेट कर सकते हैं और मास्क का उपयोग रंगीन फ़िल्टर बनाने के लिए किया जाएगा।

संपादित करें: आईओएस 8 के रूप में आप अब अपने मास्क व्यू प्रॉपर्टी को एक और दृश्य सौंपकर एक दृश्य को मुखौटा कर सकते हैं। सामान्य नियम वही रहते हैं जिसमें मास्क व्यू की अल्फा परत का उपयोग उस दृश्य की अस्पष्टता को निर्धारित करने के लिए किया जाता है, जिस पर इसे लागू किया जाता है।

+0

आपके उत्तर के लिए धन्यवाद। समस्या यह है कि मेरे पास केवल ग्रे स्केल वाली छवियां हैं (सभी बिंदुओं के लिए अल्फा == 1)। मैं ग्रे स्केल छवि को अल्फा छवि में परिवर्तित करना चाहता हूं। क्या तुम्हारे पास कोई विचार है? – subchap

+2

अच्छा यह करने का सबसे अच्छा तरीका फ़ोटोशॉप जैसे छवि संपादन सूट में लेना और वहां रूपांतरण करना है। वैकल्पिक रूप से इसे एक नया छवि संदर्भ बनाकर प्रोग्रामेटिक रूप से करना होगा, फिर ग्रे घटक को पढ़ने वाली पुरानी छवि पर पिक्सेल-बाय-पिक्सेल के माध्यम से जाकर, और इसे अपने नए रंग में बदलने से पहले अपने नए रंग के लिए अल्फा घटक में परिवर्तित करना होगा ।यह श्रमिक और समय बर्बाद है, क्योंकि आप इसे एक पेंट पैकेज में कर कर कम प्रोसेसर समय का उपयोग करेंगे। – Ash

+1

फ़ोटोशॉप में यह आसानी से किया जाता है: (1) एक नई परत बनाएं (2) काले रंग के साथ इसके एक हिस्से को भरें (3) इसे मास्क में अपनी ग्रेस्केल छवि के पीछे एक परत मुखौटा (4) दें। काला = पारदर्शी, सफेद = अपारदर्शी, पारदर्शिता की डिग्री अलग-अलग होती है। (5) परत मुखौटा लागू करें (परत पैनल में मास्क पर दायाँ क्लिक करें और 'परत मास्क लागू करें' पर क्लिक करें) (6) आपको आवश्यक परत के हिस्से को फसल करें। –

1

मुझे अपने सिर के ऊपर से सटीक कोड नहीं पता है लेकिन मूल विचार दो UIViews होना है। एक UIView में इसकी छवि प्रॉपर्टी ग्रे ग्रे स्केल होने के लिए सेट की जाएगी और अन्य UIView सामान्य रूप से सेट किया जाएगा, केवल अंतर यह है कि आप "सामान्य" छवि वाले UIView के शीर्ष पर प्रारंभिक UIView को सीधे स्थिति में रखेंगे।

मुझे उम्मीद है कि आपके विचार को एक कदम आगे बढ़ाने के लिए पर्याप्त है।

+0

अपने जवाब के लिए धन्यवाद। मैंने इसे स्पष्ट नहीं किया, लेकिन मैं चाहता हूं कि ग्रे स्केल छवि को अल्फा छवि में परिवर्तित करें (जैसे सामान्य मास्किंग करता है), और इसे UIView पर लागू करें। – subchap

6

आईओएस 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

संबंधित मुद्दे