2011-12-29 12 views
15

स्थापना संक्षेप में:की एक नव निर्मित सही फ्रेम CAShapeLayer

  1. एप्पल frame या bounds एक CAShapeLayer स्वचालित रूप से करने के लिए निर्धारित नहीं करता है (और एप्पल नहीं [UIView sizeThatFits] के किसी समान लागू किया गया है)
  2. आप सेट करते हैं पथ के बाध्यकारी बॉक्स के आकार का उपयोग करके फ्रेम ... सब कुछ गलत हो जाता है। कोई फर्क नहीं पड़ता है आप कैसे यह सेट करने का प्रयास है, यह शिकंजा-अप पथ

तो, सही तरीका प्रोग्राम के रूप में की एक नव जोड़ा CGPath साथ एक नव निर्मित CAShapeLayer फ्रेम सेट करने के लिए क्या है? इस मामले पर ऐप्पल के दस्तावेज़ चुप हैं।

बातें मैं कोशिश की है, वह काम नहीं:

  1. एक CAShapeLayer
  2. एक CGPath बनाएँ, परत
  3. में जोड़ने की जाँच करें परत की frame - यह है {{0,0},{0,0}}
  4. सेट करें: layer.frame = CGPathGetBoundingBox(layer.path)
  5. फ़्रेम अब सही है, लेकिन पथ अब ऑफसेट है -बदल रहा है layer.bounds = CGPathGetBoundingBox(layer.path)

  6. ... यह सब पागल हो जाता है:पथ का कारण बनता है प्रभावी रूप से एक अतिरिक्त (x,y) पिक्सल

  7. सेट स्थानांतरित कर दिया जाए। कुछ भी समझ में आता है

  8. layer.position = CGPathGetBoundingBox(layer.path).origin
  9. ... कोई पासा नहीं कर इसे ठीक करने का प्रयास करें; अभी भी पागल

एक बात मैं काम किया है कि कोशिश की है, लेकिन समस्याओं कहीं और का कारण बनता है:

संपादित करें: इस जैसे ही आप स्क्रीन ऑटो बारी बारी के रूप में टूट जाता है। मेरा अनुमान है: ऐप्पल के ऑटो-रोटेट को "ट्रांसफॉर्म" संपत्ति के नियंत्रण की आवश्यकता है।

  1. एक CAShapeLayer
  2. एक CGPath बनाएँ, परत की फ्रेम बनाएं परत
  3. में जोड़ने देखें - क्या यह {{0,0},{0,0}}
  4. सेट है: layer.frame = CGPathGetBoundingBox(layer.path)
  5. सेट: layer.transform = CGAffineTransformMakeTranslation(CGPathGetBoundingBox(layer.path).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin

यह काम करता है, लेकिन ... बहुत से तृतीय पक्ष कोड मानते हैं कि प्रारंभिक परिवर्तन एफ या CALayer पहचान है।

यह मुश्किल नहीं होना चाहिए! निश्चित रूप से कुछ ऐसा है जो मैं गलत कर रहा हूं?

(मेरे पास एक सुझाव था: "हर बार जब आप पथ जोड़ते हैं, तो -1 * (top-left-point.x, top-left-point.y) द्वारा सभी बिंदुओं को स्थानांतरित करने के लिए मैन्युअल रूप से एक कस्टम फ़ंक्शन चलाएं"।दोबारा, यह काम करता है - लेकिन यह हास्यास्पद रूप से जटिल है)

+0

क्या आपको कभी इसका समाधान मिला? – jannej

+0

अभी तक नहीं। मैं वर्तमान में प्रश्न से कामकाज का उपयोग कर रहा हूं। यह धीमा है और इसे बनाए रखने के लिए दर्द है। मुझे लगता है कि समस्या ऐप्पल के कोड में एक बग है, शायद? – Adam

+3

एक छोटा सा परिशिष्ट: मुझे अंततः पता चला कि ".frame" ऐप्पल द्वारा असमर्थित है। यह विचित्र है, क्योंकि यह हर जगह उपयोग किया जाता है - लेकिन यदि आप दस्तावेज़ों और/या ऐप्पल मेलिंग सूचियों में काफी गहराई से खुदाई करते हैं, तो आप ऐप्पल इंजीनियरों के नोट्स खोजते हैं कि यह काम करने का इरादा नहीं है और वे इसके साथ बग ठीक नहीं करेंगे। आपको उम्मीद है कि/सब कुछ के लिए बाउंड्स का उपयोग करने की आवश्यकता है, और "readonly" के रूप में .frame का इलाज करें। तो यह विशेष रूप से विडंबना है कि इस मामले में सेटिंग। फ्रेम "लगभग काम करता है", जहां सेटिंग। बाउंड "कभी काम नहीं करता" :) – Adam

उत्तर

4

पथ सीमाओं में परत.बाउंड सेट करना सही काम है - आप परत की स्थानीय समन्वय स्थान को पथ से मेल करना चाहते हैं। लेकिन फिर आपको परत की स्थिति संपत्ति को अपने सुपरलेयर में सही जगह पर ले जाने की भी आवश्यकता है।

(सेटिंग। फ्रेम आपके लिए .bounds और .position के सही मानों की गणना करने वाले ढांचे में अनुवाद करता है, लेकिन यह हमेशा बाउंड छोड़ देता है। ऑरिगिन अनछुआ, जो आप नहीं चाहते हैं जब आपके पथ की सीमाओं में गैर-शून्य मूल हो ।)

तो कुछ इस तरह काम करना चाहिए, यह सोचते हैं आप अपने सामान्य (.5, .5) मूल्य से anchorPoint नहीं बदला है और परत अपनी superlayer की उत्पत्ति के फ्लश स्थिति हैं:

CGRect r = CGPathGetBoundingBox(layer.path); 
layer.bounds = r; 
layer.position = CGPointMake(r.size.width*.5, r.size.height*.5); 
संबंधित मुद्दे