2009-08-19 6 views
3

Hallo in meiner App Ich habe einige uiButtons als Unteransichten zu einer Ansicht wie in der folgenden Abbildung hinzugefügt. alt text http://img99.imageshack.us/img99/5244/portraitc.pngUIButtons reagieren nicht auf Berührungen nach dem Setzen von Rahmen auf Autorotation

, wenn der Benutzer das Telefon in der Landschaft dreht sich die Ansichten und Tasten müssen Position dies ändern: alt text http://img193.imageshack.us/img193/5931/landscapeq.png

zunächst, wenn die Ansicht im Portrait-Modus ist die Tasten auf Berührungen reagieren. Wenn ich das Telefon kippe, bewegen sich die Tasten, alles sieht wie auf dem zweiten Bild aus und die Tasten reagieren auf Berührungen. Wenn ich das Telefon zurück in den Hochformat-Modus kippe, bewegen sich die Tasten zurück, sie sehen gut aus, aber sie reagieren nicht auf Berührungen. Wenn ich die Tasten Arbeit zurück zum Querformat wechseln ...

meine Tasten sind wie folgt erstellt:

nextNewsP = [[UIButton alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 40, 10, 25, 25)]; 
[nextNewsP setImage:[UIImage newImageFromResource:@"next_arrow.png"] forState:UIControlStateNormal]; 
[nextNewsP addTarget:self action:@selector(nextNewsAction:) forControlEvents:UIControlEventTouchUpInside]; 
[nextNewsP setShowsTouchWhenHighlighted:TRUE]; 
[bottomTools addSubview:nextNewsP]; 
[nextNewsP release]; 

previousNewsP = [[UIButton alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 85, 10, 25, 25)]; 
[previousNewsP setImage:[UIImage newImageFromResource:@"previous_arrow.png"] forState:UIControlStateNormal]; 
[previousNewsP addTarget:self action:@selector(previousNewsAction:) forControlEvents:UIControlEventTouchUpInside]; 
[previousNewsP setShowsTouchWhenHighlighted:TRUE]; 
[bottomTools addSubview:previousNewsP]; 
[previousNewsP release]; 

bottomTools eine Ansicht ist und wird auch als ein Subview wie folgt hinzugefügt:

[self.view addSubview:bottomTools]; 
[bottomTools release]; 

und meine ShouldAutorotateToInterfaceOrientation Funktion wie folgt aussieht:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 


    [UIView beginAnimations:@"moveViews" context: nil]; 


    if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    { 
     NSLog(@"set frames for portrait"); 
     closeView.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 30, 2, 23, 25); 
     newsInfo.frame = CGRectMake(10, 10, [[UIScreen mainScreen] bounds].size.width - 10, 22); 
     internetActivityIndicator.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 55, 5, 18, 18); 
     industryLabel.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width/2.0 - [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width/2, 3, [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width, 22); 
     bottomTools.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.height-40, [[UIScreen mainScreen] bounds].size.width, 40); 
     nextNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 40, 10, 25, 25); 
     previousNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 85, 10, 25, 25); 
    } 
    else 
    { 
     NSLog(@"set frames for landscape"); 
     closeView.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 30, 2, 23, 25); 
     newsInfo.frame = CGRectMake(10, 10, [[UIScreen mainScreen] bounds].size.height - 10, 22); 
     internetActivityIndicator.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 55, 5, 18, 18); 
     industryLabel.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height/2.0 - [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width/2, 3, [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width, 22); 
     bottomTools.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.width-40, [[UIScreen mainScreen] bounds].size.height, 40); 
     nextNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 40, 10, 25, 25); 
     previousNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 85, 10, 25, 25); 
    } 

    [UIView commitAnimations]; 

return YES; 

}

hatten Sie jemals ein ähnliches Problem? Vielen Dank im Voraus, Sorin

Antwort

0

Ich denke, Ihr Problem ist in Ihrem Rahmen Anpassung. Mein Bauchgefühl sagt mir, dass es etwas damit zu tun hat, dass die Logik innerhalb von shouldAutorotateToInterfaceOrientation liegt, weil das passiert, bevor die Rotation tatsächlich gemacht wird. Versuchen Sie, Ihre Mathe so zu tun, wie sie es in this article tun und sehen, ob das hilft.

+0

Vielen Dank für den Link. Ich werde es versuchen und mit einem Feedback zurückkommen. Sorin –

+0

Der Artikel war wirklich nützlich, danke! es funktionierte :) –

1

Ich kämpfe eigentlich immer noch mit dem gleichen Problem (ein Jahr später ... brauche iOS 3.0 Kompatibilität). Der Rotationsteil war einfach. Die Ansichten und Schaltflächen scheinen jedoch keine Berührungen zu verarbeiten und Ereignisse zu verschieben oder zu ziehen. Ich habe überprüft, dass das Fenster (UIWindow) die Berührungsereignisse und an den richtigen Stellen empfängt.

Es ist, als ob das letzte 1/3 des Bildschirms (d. H. 480-320) Ereignisse nach einer Rotation von Querformat zu Querformat nicht an Empfänger weiterleitet.

Das Beispiel in der Verknüpfung von slf hilft nicht, da der gedrehte View-Controller keine Responder hat.


Ich habe es gerade nach ein paar Blick graben. Also habe ich die viewController.view rotiert und eine Menge setNeedsLayout auf Subviews von viewController.view ausgeführt. Was ich jedoch tun musste, war [self.navigationController.view setNeedsLayout]. Dieser eine Anruf hat alles für mich festgelegt. Aus welchem ​​Grund auch immer, die navigationController.view übertrug Touch-Ereignisse nicht an den Teil der Subviews, die zuvor ausgeblendet waren (soweit es den Rahmen/die Grenze betrifft). Das hat auch eine Reihe anderer Probleme behoben.

+0

überprüfen, um zu sehen, ob Ansichten nicht überlappen oder wenn sie Benutzerinteraktion aktiviert haben. diese kommen mir momentan in den Sinn. –

+0

Na, das ist es nicht. Ich habe es gerade herausgefunden, nachdem ich etwas gegraben habe. Also habe ich die viewController.view rotiert und eine Menge setNeedsLayout auf Subviews von viewController.view ausgeführt. Was ich jedoch tun musste, war [self.navigationController.view setNeedsLayout]. Dieser eine Anruf hat alles für mich festgelegt. Aus welchem ​​Grund auch immer, die navigationController.view übertrug Touch-Ereignisse nicht an den Teil der Subviews, die zuvor ausgeblendet waren (soweit es den Rahmen/die Grenze betrifft). Das hat auch eine Reihe anderer Probleme behoben. – Ephraim

0

Ich habe das Problem behoben, das ich hatte .. Ich musste im Grunde [self.navigationController.view setNeedsLayout] tun.

Die Art und Weise verstehe ich das (die vielleicht nicht richtig ist, dass self.navigationController.view.frame gleiche war wie self.view.frame und beide waren gleich (x = 0, y = 0, Breite = 320, Höhe = 480). I dann self.view durch M_PI/2 gedreht und hat bei self.view eine Reihe von Frame-Manipulationen durchgeführt.Subviews, um alles richtig animieren/positionieren/skalieren zu können.

Das klappte in Ordnung, aber der Navigationscontroller war nicht bereit, Touch-Ereignisse zu Teilen von self.view zu bestätigen, da waren rechts von 320. Im Wesentlichen, wenn diese self.navigationController.view.clipsToBounds wahr wären, hätte es nicht einmal diesen Teil gezeigt von Selbstbetrachtung.

Wie auch immer, das Setzen von setNeedsLayout auf der Ansicht des Navigationscontrollers löste das Problem. Ich hoffe, das hilft jemand anderem. Ich vermute, das war auch das Problem, das SorinA mit Knöpfen hatte, die keine Berührungsereignisse erhielten.

+0

Dies ist meine Lösung für mein eigenes Problem, das unten veröffentlicht wird. – Ephraim

Verwandte Themen