UIViewController περιστρέφονται μέθοδοι

ψήφοι
17

Τι αντικείμενο είναι υπεύθυνη για dipatching τις UIViewControllerμέθοδο εναλλαγής κλήσεων, δηλαδή:

  • shouldAutorotateToInterfaceOrientation:
  • willRotateToInterfaceOrientation:duration:
  • willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
  • willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:

Φαντάζομαι ότι είναι UIApplication(αλλά ίσως η AppDelegate ή UIWindow).

Το επόμενο ερώτημα είναι πώς το αντικείμενο γνωρίζει ποια UIViewControllerνα μιλήσω;

Πώς ξέρει ποια UIViewControllerέχει την άποψή του ως δευτερεύουσας προβολής του παραθύρου;

Είναι ένα μήνυμα που μπορεί να στείλει ή ένα ακίνητο μπορείτε να ορίσετε (κάποιου αντικειμένου) που καθορίζει το «Active» υπάρχει UIViewControllerγια την εφαρμογή;

Δημοσιεύθηκε 14/02/2009 στις 00:50
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
13

Φαίνεται ότι UIApplicationη αποστολή ενός μηνύματος στο ενεργό ελεγκτή άποψη.

Αλλά πώς View Controller παράδειγμα σας να πάρετε αυτά τα μηνύματα;

Το μήνυμα προωθείται στο πρώτο ελεγκτή προβολή του οποίου την άποψη έχει προστεθεί στο UIWindowπαράδειγμα.

Αυτό συνοψίζεται στα 3 βασικά σενάρια:

  1. Η ViewController οποίων θέα προστίθεται απ 'ευθείας στο UIWindow παράδειγμα (και μόνο app προβολή)

  2. Το χειριστήριο πλοήγησης σε μια εφαρμογή που βασίζεται πλοήγησης, τότε το χειριστήριο πλοήγησης προωθεί το μήνυμα προς τις δραστικές απόψεις δείτε ελεγκτή.

  3. Ο ελεγκτής μπαρ καρτέλα σε ένα app μπαρ καρτέλα βάση, τότε ο ελεγκτής μπάρα προωθεί το μήνυμα προς τις δραστικές απόψεις προβολή ελεγκτή (ή το ενεργό χειριστήριο πλοήγησης).

Το πρόβλημα που θα έχετε, είναι αν οικοδομήσουμε μια εφαρμογή με πολλαπλές απόψεις, αλλά ΜΗΝ χρησιμοποιήσετε έναν ελεγκτή πλοήγησης ή ελεγκτή Tab Bar. Αν ανταλλάξουν απόψεις μέσα και έξω από το UIWindowπαράδειγμα με το χέρι, δεν θα λαμβάνετε αυτά τα μηνύματα αξιόπιστα. Αυτό είναι παρόμοιο με θέσεις όπως αυτό: iPhone viewWillAppear δεν ψήσιμο

Απλά χρησιμοποιήστε συμβάσεις της Apple για πολλαπλές προβολές και θα είναι μια χαρά. Η ελπίδα αυτή εξοικονομεί κάποιος μια ώρα ή δύο

Απαντήθηκε 19/02/2009 στις 05:49
πηγή χρήστη

ψήφοι
4

Πώς ξέρετε ποια UIViewController έχει την άποψή του ως δευτερεύουσας προβολής του παραθύρου;

UIViewController τάξη διατηρεί στατικός χάρτης των απόψεων και των ελεγκτών άποψή τους. Ο χάρτης των ψήφων σε μερικά βασικά σημεία στο εσωτερικό CocoaTouch. Ειδικότερα, [UIView nextResponder] αυτό ερωτήματα και επιστρέφει τον ελεγκτή εάν βρεθεί.

Υποθέτω UIWindow κάνει το ίδιο αναζήτησης με θέα ρίζα του να γνωρίζει ποιος ελεγκτής να διαβιβάσει τα γεγονότα περιστροφής. Θα ελέγξει αυτό την επόμενη φορά που θα πρέπει να ψάχνει κάτι επάνω στην αποσυναρμολόγηση. (Έχω περάσει κάποιο χρόνο αντίστροφης μηχανικής CocoaTouch να κατανοήσουν πώς λειτουργούν τα πράγματα εκεί.)

Απαντήθηκε 06/05/2009 στις 12:15
πηγή χρήστη

ψήφοι
4

Αυτό είναι μαγεία που δεν θέλετε ποτέ να ανησυχούν. Απλά προσθέστε την άποψή ρίζα ελεγκτή σας στο παράθυρο - ή να πάρετε μια μπάρα ή τον ελεγκτή πλοήγησης για να το κάνει για σας - και θα λαμβάνετε αυτά τα μηνύματα.

(Αλλά αν σακί γύρω από το πρόγραμμα εντοπισμού σφαλμάτων, που μπορεί να καταλήξει στο ίδιο συμπέρασμα έχω:. Υπάρχει ένα είδος εσωτερικής πίνακα χαρτογράφησης άποψη του κάθε ελεγκτή πίσω στον ελεγκτή, και τα μηνύματα που αποστέλλονται με βάση αυτό το σύνδεσμο)


Ενημέρωση: Αυτό ήταν πραγματικά ιδιωτικού μαγικό το 2009, όταν έγραψα το πρώτο αυτήν την απάντηση, αλλά οι επόμενες αλλαγές iOS έχουν κάνει τα APIs πίσω από το κοινό. Ο ελεγκτής άποψη ρίζα είναι πλέον προσβάσιμα μέσω της UIWindow.rootViewControllerιδιοκτησίας, και το δέντρο των απόγονος ελεγκτών άποψη σχηματίζεται χρησιμοποιώντας το UIViewController.childViewControllersακίνητο.

Μητρική ελεγκτές άποψη είναι υπεύθυνη για την κοινοποίηση των παιδιών τους, των αλλαγών προσανατολισμού. (Δεν είμαι σίγουρος πώς ο ελεγκτής άποψη ρίζα έχει κοινοποιηθεί, αλλά μπορείτε να ορίσετε ένα σημείο διακοπής και ανακαλύψτε μόνοι σας.) Η -shouldAutomaticallyForwardRotationMethodsμέθοδος αποφασίζει εάν UIViewController θα το κάνει αυτό για σας. Αν επιστρέψει NO, θα γίνουν υπεύθυνοι γι 'αυτό που σου -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:και -didRotateFromInterfaceOrientation:μεθόδους.

Απαντήθηκε 14/02/2009 στις 01:42
πηγή χρήστη

ψήφοι
1

Έχω ένα παρόμοιο πρόβλημα.

Έχω ένα παιχνίδι που εργάζονται σε οριζόντιο προσανατολισμό (και τα δύο αριστερά και δεξιά του τοπίου).

Για να διαχειριστείτε μια εφαρμογή πολλαπλών θέα μπορώ να χρησιμοποιήσω ένα UIviewController ρίζα, δηλαδή μια εικονική UIViewcontroller με UIView που δεν κάνει τίποτα. Στη συνέχεια προσθέστε όλα τα άλλα UIView σε αυτό ως δευτερεύουσας προβολής.

Κατά την έναρξη της εφαρμογής, ο εξομοιωτής περιστρέφεται γρήγορα σε ένα κατακόρυφο προσανατολισμό, και παίρνω κάθε μία από τις απόψεις μου με αυτό το ακίνητο πλαίσιο μοιάζοντας (0, -80.320.480). Αυτό έχει ως αποτέλεσμα την προβολή που ψαλιδίζεται από έναν 160 Χ 320 ορθογώνιο στη δεξιά πλευρά.

Έχω παρατηρήσει ότι η - shouldAutorotateToInterfaceOrientation: μέθοδος της κάθε δευτερεύουσας προβολής καλείται μόνο μία φορά, και αυτό συμβαίνει όταν προστίθεται στην προβολή της ρίζας. Αργότερα, κατά την περιστροφή της συσκευής, μόνο η θέα ρίζα παίρνει η μέθοδος είναι ονομάζεται.

Όπως ήταν αναμενόμενο, κάθε ένα από τα - willAnimate * μέθοδοι κλήσεις αποστέλλονται μόνο στην προβολή ρίζα, έτσι, καθορίζοντας οποιαδήποτε από αυτές τις μεθόδους subviews είναι άσκοπο.

Αυτές οι μέθοδοι καλούνται κάθε φορά ο προσανατολισμός έχει αλλάξει σε έναν προσανατολισμό αποδεκτές από την - shouldAutorotateToInterfaceOrientation: μέθοδος. έτσι σκέφτηκα ότι θα μπορούσα να chnage ιδιοκτησίας πλαίσιο subviews μου από εκεί.

Για να επιτευχθεί αυτό, ορίζεται η ακόλουθη μέθοδο στην τάξη rootViewController μου:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
    subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
        ...
}

Δεν καταλαβαίνω γιατί η ιδιοκτησία πλαίσιο δεν ενημερώνεται, αλλά ξέρω ότι αυτή η λύση λειτουργεί.

Η ελπίδα αυτό βοηθά ....

Απαντήθηκε 25/03/2010 στις 05:20
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more