2013-10-14 12 views
6

मैं अपने एसकेसीन को टाइल्स के साथ भरने की कोशिश कर रहा हूं, एक आईपैड ऐप में जो केवल लैंडस्केप मोड का समर्थन करता है। दृश्य के भीतर मैं w जैसे ज & का पता लगाने:एसकेएससीन आईपैड ऊंचाई चौड़ाई

int h = [UIScreen mainScreen].bounds.size.height; 
int w = [UIScreen mainScreen].bounds.size.width; 

दुर्भाग्य से, वापस भेज दिया आयाम हैं कि वे क्या करने की आवश्यकता है के विपरीत है। एसओ चर्चा में बहुत सारे विषय इस समस्या को व्यू कंट्रोलर या व्यू की सामग्री में चर्चा करते हैं, और समाधान दृश्य आकार में स्क्रीन आकार का पता लगाने के लिए प्रतीत होता है, दृश्य में नहीं, DidLoad। हालांकि, यह एसकेएससीनेस के लिए एक वैध समाधान प्रतीत नहीं होता है।

कोई सुझाव?

उत्तर

12

प्रयास करें, viewDidLoad का उपयोग नहीं है और उपयोग इस

- (void)viewWillLayoutSubviews 
{ 
    [super viewWillLayoutSubviews]; 

    SKView * skView = (SKView *)self.view; 
    if (!skView.scene) { 
     skView.showsFPS = YES; 
     skView.showsNodeCount = YES; 

     SKScene * scene = [MyScene sceneWithSize:skView.bounds.size]; 
     scene.scaleMode = SKSceneScaleModeAspectFill; 

     // Present the scene. 
     [skView presentScene:scene]; 
    } 
} 
+3

+1 दृश्य के दृश्य का परीक्षण करने के लिए +1 शून्य नहीं है - मैंने देखा है कि अधिकांश समाधान इस तथ्य पर विचार नहीं करते हैं कि देखें WillLayoutSubviews बार-बार कहा जा सकता है, यानी जब दृश्य आकार या दृश्यता – LearnCocos2D

+0

बदलती है क्या आपका मतलब है ViewDidLoad का उपयोग न करें दृश्य नियंत्रक में? मुझे किस फ़ाइल में viewWillLayoutSubviews लागू करना चाहिए? एसकेएससीन, व्यू कंट्रोलर, या कहीं और? – zeeple

+0

व्यू कंट्रोलर में, आपको एक विधि दिखाई देगी जिसमें अनिवार्य रूप से उपर्युक्त सामग्री शामिल है, लेकिन इसका यह ViewDidLoad है, इसे हटाएं, और उपर्युक्त विधि। – DogCoffee

10

यह को मतलब नहीं है लेआउट हैंडलर में दृश्य आरंभ कर देगा। लेआउट हैंडलर में दृश्य का आकार बदलें। (यही कारण है कि इसके लिए है।)

@implementation SGOMyScene 
{ 
    SKScene *scene; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    SKView *skView = (SKView *)self.view; 
    skView.showsFPS = YES; 
    skView.showsNodeCount = YES; 

    scene = [SGOMyScene sceneWithSize:skView.bounds.size]; 
    scene.scaleMode = SKSceneScaleModeAspectFill; 

    [skView presentScene:scene]; 
} 

- (void)viewWillLayoutSubviews 
{ 
    [super viewWillLayoutSubviews]; 

    SKView *skView = (SKView *)self.view; 
    scene.size = skView.bounds.size; 
} 

आपका दृश्य - (void)didChangeSize:(CGSize)oldSize सही जगह में सब कुछ ले जाने के लिए लागू करना चाहिए।

हुरेय, अब आपका गेम डिवाइस रोटेशन को संभालता है।

+2

इच्छा है कि मैं इस बार कई बार मतदान कर सकता हूं। जब तक ऊपर और विभिन्न पुस्तकों में देखा गया व्यूविल्लआउटआउट्यूविंग तकनीक, कुछ हद तक काम करती है यदि आप दृश्य की वास्तविक चौड़ाई और ऊंचाई लॉग करते हैं तो वे प्रारंभिक सेटिंग से कभी नहीं बदलते हैं। जबकि उपरोक्त प्रारंभिकरण और परिवर्तन की देखभाल करता है। – TJA

+0

यह भी देखें कि WillLayoutSubviews को हर बार डिवाइस घुमाए जाने पर भी बुलाया जाता है, जो दर्द होता है –

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