मैं पैन, चुटकी, और यूआईजीएस्टर रिकॉग्नाइज़र को घुमाता हूं ताकि उपयोगकर्ता को कुछ यूआई तत्वों को ठीक से रखा जा सके जहां वे चाहते हैं। http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more से कोड का उपयोग करना (या http://mobile.tutsplus.com/tutorials/iphone/uigesturerecognizer/ से इसी तरह का कोड) दोनों मुझे यह बताते हैं कि उपयोगकर्ता को इन UI तत्वों को अपनी इच्छानुसार रखने के लिए क्या चाहिए।लोडिंग UIView ट्रांसफॉर्म और सेटिंग्स से केंद्र अलग-अलग स्थिति
उपयोगकर्ता बाहर निकलता है "यूआई लेआउट" मोड, मैं सहेजते हैं UIView के बदलने और इतने की तरह केंद्र:
NSString *transformString = NSStringFromCGAffineTransform(self.transform);
[[NSUserDefaults standardUserDefaults] setObject:transformString forKey:@"UItransform", suffix]];
NSString *centerString = NSStringFromCGPoint(self.center);
[[NSUserDefaults standardUserDefaults] setObject:centerString forKey:@"UIcenter"];
मैं एप्लिकेशन को फिर से लोड करते हैं, मैंने पढ़ा UIView के बदलने और इतने की तरह केंद्र:
NSString *centerString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UIcenter"];
if(centerString != nil)
self.center = CGPointFromString(centerString);
NSString *transformString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UItransform"];
if(transformString != nil)
self.transform = CGAffineTransformFromString(transformString);
और UIView घूमता है और सही ढंग से स्केल किया जाता है, लेकिन गलत जगह पर। इसके अलावा, फिर से "यूआई लेआउट" मोड दर्ज करने पर, मैं हमेशा विभिन्न संकेतों के साथ दृश्य को नहीं पकड़ सकता (जैसा कि प्रदर्शित किया गया दृश्य इशारा पहचानकर्ता द्वारा समझा गया दृश्य नहीं है?)
मेरे पास भी है रीसेट बटन जो पहचान के लिए UIView के transform
और उसके center
को एनआईबी से लोड होने पर जो भी हो, सेट करता है। लेकिन परिवर्तित UIView केंद्र लोड करने और बदलने के बाद, रीसेट भी काम नहीं करता है। UIView की स्थिति गलत है।
मेरा पहला विचार यह था कि चूंकि उन इशारा कोड उदाहरण center
बदलते हैं, इसलिए यह घूर्णन विभिन्न केंद्रों के आसपास हो रहा है (चाल, घूर्णन और तराजू के कुछ अप्रत्याशित अनुक्रम को मानते हुए)। चूंकि मैं संपादन के पूरे अनुक्रम को सहेजना नहीं चाहता (हालांकि यह आसान हो सकता है अगर मैं लेआउट मोड में कुछ पूर्ववत फीचर रखना चाहता हूं), मैंने इसे स्थानांतरित करने के लिए ट्रांसफॉर्म का उपयोग करने के लिए यूआईपीएनजेस्टर रिकॉग्नाइज़र हैंडलर को बदल दिया। एक बार जब मैं काम कर रहा हूं, तो मुझे लगता है कि ट्रांसफॉर्म को बचाने से मुझे वर्तमान स्थान और अभिविन्यास मिलेगा, भले ही आदेश क्या हुआ। लेकिन ऐसी कोई किस्मत नहीं है। मुझे अभी भी इस तरह एक निराशाजनक स्थिति मिलती है।
तो मुझे नुकसान हुआ है। यदि कोई UIView स्थानांतरित हो गया है और एक नई स्थिति में घुमाया गया है, तो मैं उस स्थान और अभिविन्यास को इस तरीके से कैसे सहेज सकता हूं कि मैं इसे बाद में लोड कर सकूं और UIView को वापस कहां से प्राप्त कर सकूं?
अगर मैंने इस अधिकार को टैग नहीं किया है या इसे सही तरीके से नहीं रखा है या कुछ अन्य स्टैक ओवरफ्लो पाप नहीं किया है, तो पहले से क्षमा करें। यह पहली बार है जब मैंने यहां पोस्ट किया है।
EDIT
मैं अब तक दो सुझावों का प्रयास कर रहा हूं। मुझे लगता है कि वे प्रभावी रूप से एक ही चीज हैं (एक फ्रेम को बचाने का सुझाव देता है और दूसरा मूल को बचाने का सुझाव देता है, जो मुझे लगता है कि फ्रेम.ऑरिगिन है)।
तो अब प्रीफ़्स कोड से सेव/लोड में निम्नलिखित शामिल हैं।
सहेजें:
NSString *originString = NSStringFromCGPoint(self.frame.origin);
[[NSUserDefaults standardUserDefaults] setObject:originString forKey:@"UIorigin"];
लोड ( बदलने लोड करने से पहले):
NSString *originString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UIorigin"];
if(originString) {
CGPoint origin = CGPointFromString(originString);
self.frame = CGRectMake(origin.x, origin.y, self.frame.size.width, self.frame.size.height);
}
मैं एक ही मिलता है (या इसी तरह - यह बताने के लिए मुश्किल है) परिणाम। वास्तव में, मैंने केवल prefs को पुनः लोड करने के लिए एक बटन जोड़ा, और एक बार दृश्य घुमाए जाने के बाद, "रीलोड" बटन बार-बार ऑफसेट द्वारा UIView को स्थानांतरित कर देगा (हालांकि फ्रेम या ट्रांसफॉर्म स्वयं के सापेक्ष हैं - जो मुझे यकीन है एक सुराग है, लेकिन मुझे यकीन नहीं है कि यह क्या इंगित कर रहा है)।
संपादित करें # 2
यह मैं दृश्य के frame
पर निर्भर करता है के बारे में चिंता करता है। एप्पल http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW6 (जोर मेरा) से:
केंद्र संपत्ति में मूल्य हमेशा वैध है, भले ही स्केलिंग या रोटेशन कारकों को देखने के बदलने के लिए जोड़ा गया है। फ्रेम प्रॉपर्टी में मान के लिए भी यह सच नहीं है, जिसे अमान्य माना जाता है यदि दृश्य का रूपांतरण पहचान परिवर्तन के बराबर नहीं है।
संपादित # 3
ठीक है, तो जब मैं में वरीयता लोड हो रहा हूँ, सब कुछ ठीक लग रहा है। यूआई पैनल का bounds
रेक्ट {{0, 0}, {506, 254}} है। मेरे वीसी के दृश्य के अंत में डिडलोड विधि, अभी भी ठीक लगता है। लेकिन जब तक चीजें वास्तव में प्रदर्शित होती हैं, bounds
कुछ और है। उदाहरण के लिए: {{0, 0}, {488.321, 435.981}} (ऐसा लगता है कि एक बार घुमाए जाने और स्केल किए जाने पर इसके पर्यवेक्षण में कितना बड़ा है)। यदि मैं सीमाओं को रीसेट करता हूं जो इसे माना जाता है, तो यह वापस स्थानांतरित हो जाता है।
सीमाओं को रीसेट करने के लिए पर्याप्त है जो उन्हें प्रोग्रामेटिक रूप से माना जाता है, लेकिन मुझे वास्तव में यह सुनिश्चित नहीं है कि यह कब करना है! मैंने इसेडिडलोड के अंत में ऐसा करने के लिए सोचा होगा, लेकिन उस बिंदु पर bounds
अभी भी सही है।
संपादित करें # 4
मैं layoutSubviews में initWithCoder में self.bounds पर कब्जा (के रूप में यह एक निब से आ रहा है) की कोशिश की, और फिर, कि कब्जा कर लिया CGRect को self.bounds को रीसेट। और वह काम करता है।
लेकिन यह खतरनाक हैकी और खतरे से भरा हुआ लगता है। यह वास्तव में ऐसा करने का सही तरीका नहीं हो सकता है। (क्या यह हो सकता है?) नीचे स्क्रैम का उत्तर इतना सरल लगता है, लेकिन ऐप फिर से लोड होने पर मेरे लिए काम नहीं करता है।
ग्रेट पहला सवाल! एसओ में आपका स्वागत है! – jrturton
धन्यवाद, jrturton :) तो वास्तव में कुछ और है। तथ्य यह है कि मुझे मिनटों के भीतर दो जवाब मिल गए (भले ही मैं अभी तक सफल नहीं हुआ हूं) बस शानदार है! – sbkp
संभवतः आप घूर्णन/ज़ूम के लिए स्केल और रोटेशन ट्रांसफॉर्म के संयोजन का उपयोग कर रहे हैं, और बस पैन के लिए केंद्र को ले जा रहे हैं? – jrturton