2011-09-15 59 views
1

我使用方向爲iPad寫了一個應用程序。 在App-Delegate.h有一個窗口,一個UIViewController中,一個UINavigationController的和的UITabBarController:更多視圖和控制器(iPad)的方向問題

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet LoginRVC *loginRVC; 
@property (nonatomic, retain) IBOutlet ChooseCameraRVC *chooseCameraRVC; 
@property (nonatomic, retain) IBOutlet UITabBarController *hauptRVC; 

每個控制器使用 「shouldAutorotateToInterfaceOrientation」 - 方法來自轉本身。

我更改使用的觀點:

[UIView beginAnimations:nil context:NULL]; 

然後

[loginRVC.view removeFromSuperview]; 
[_window addSubview:chooseCameraRVC.view]; 

另一路太繞,OFC。

所以我的問題是,當我在第二視圖(chooseCameraRVC)和開關的方向,然後回到我的第一個觀點,它不是旋轉。它會自動旋轉,但動畫完成後。

我試過很多東西就像調用的所有意見「shouldAutorotateToInterfaceOrientation」 - 方法,不去除窗口的意見......但沒有成功,直到如今。

這也許是模擬器的「功能」? (我希望不是)。

請幫助我。 Sharky


好的。我準備了我的源代碼在這裏介紹。

注:我沒抄其中只有[超級...]內或完全註釋掉的方法。

起初AppDelegate.h:

#import <UIKit/UIKit.h> 
#import "ChooseCameraRVC.h" 
#import "LoginRVC.h" 

@interface NetCoWatchAppDelegate : NSObject <UIApplicationDelegate> 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet LoginRVC *loginRVC; 
@property (nonatomic, retain) IBOutlet ChooseCameraRVC *chooseCameraRVC; 

-(void)changeView:(id)sender:(BOOL)direction; 

@end 

AppDelegate.m:

#import "NetCoWatchAppDelegate.h" 
#import "LoginRVC.h" 
#import "ChooseCameraRVC.h" 
#import "ChooseCameraVC.h" 

@implementation NetCoWatchAppDelegate 

@synthesize window = _window; 
@synthesize loginRVC, chooseCameraRVC; 

-(void)changeView:(id)sender:(BOOL)direction{ 
    //configure animation 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:2]; 
    if(sender == loginRVC){ //sender is LoginView 
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:_window cache:YES]; 
     [loginRVC.view removeFromSuperview]; 
     [_window addSubview:chooseCameraRVC.view]; 
    }else if(sender == chooseCameraRVC){ 
     [chooseCameraRVC.view removeFromSuperview]; 
     if(!direction){ //FlipFromRight = YES, ...left = NO 
      [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:_window cache:YES];   
      [_window addSubview:loginRVC.view]; 
     } 

    }else if([sender class] == [ChooseCameraVC class]){ 
     [chooseCameraRVC.view removeFromSuperview]; 
     if(!direction){ //Camera gewählt //FlipFromRight = YES, ...left = NO 
      [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:_window cache:YES]; 
      [_window addSubview:loginRVC.view]; 
     } 

    }else { //default solution 
     UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Bad Value" message:[[sender class] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [av show]; 
     [av release]; 
    } 
    [UIView commitAnimations]; //start animation 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    // Add the navigation controller's view to the window and display. 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)dealloc 
{ 
    [_window release]; 
    [loginRVC release]; 
    [chooseCameraRVC release]; 
    [super dealloc]; 
} 

@end 

的LoginRVC.h:

#import <UIKit/UIKit.h> 

@interface LoginRVC : UIViewController <UITextFieldDelegate>{ 
    NSMutableArray *usernameArray; 
    NSMutableArray *passwordArray; 
} 

@property (nonatomic, retain) IBOutlet UITextField *usernameTF; 
@property (nonatomic, retain) IBOutlet UITextField *passwordTF; 
@property (nonatomic, retain) IBOutlet UIButton *loginBn; 
@property (nonatomic, retain) IBOutlet UISwitch *saveUsernameSwitch; 

-(IBAction)tryLogin:(id)sender; 
-(IBAction)closeKeyboard:(id)sender; 

@end 

的LoginRVC.m:

#import "LoginRVC.h" 
#import "NetCoWatchAppDelegate.h" 

@implementation LoginRVC 

@synthesize usernameTF, passwordTF, loginBn, saveUsernameSwitch; 

-(IBAction)tryLogin:(id)sender{ 
    //login successful if the textfields are euqal with an existing account 
#warning Access the data base and search for the account. 
    bool accountFound = NO; 
    for (int i=0; i<usernameArray.count; i++) { 
     if([[usernameArray objectAtIndex:i] isEqualToString:usernameTF.text] 
      && [[passwordArray objectAtIndex:i] isEqualToString:passwordTF.text]){ 
      accountFound = YES; 
      break; 
     } 
    } 
    if(accountFound) 
    { //login successful - now change the values and then the view 
     if(![saveUsernameSwitch isOn]) 
      usernameTF.text = @""; 
     passwordTF.text = @""; 
     NetCoWatchAppDelegate *main = (NetCoWatchAppDelegate*)[[UIApplication sharedApplication] delegate]; 
     [main changeView:self:YES]; 
    }else{ //login failt - show a popup window for the user 
     UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Login fehlgeschlagen" message:@"Username oder Passwort falsch!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [av show]; 
     [av release]; 
    } 
} 

-(IBAction)closeKeyboard:(id)sender{ 
    if([passwordTF isFirstResponder]) 
     [passwordTF resignFirstResponder]; 
    else 
     [usernameTF resignFirstResponder]; 
} 

// this helps dismiss the keyboard then the "done" button is clicked 
- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    if(textField == usernameTF){ //move to password textfield 
     [textField resignFirstResponder]; 
     [passwordTF becomeFirstResponder]; 
    }else if(textField == passwordTF){ //textField == passwordTF -> try to login 
     [textField resignFirstResponder]; 
     [self tryLogin:self]; 
    } 
    return YES; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization  
    } 
    return self; 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib.textFieldRounded.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support 
#warning Define right keyboard type. 
    usernameArray = [[NSMutableArray alloc] initWithObjects:@"dkoehn", @"bmazanek", @"sbehne", @"mballhausen", @"efiedler", @"bbraasch", @"azuber", @"tstolt", nil]; 
    passwordArray = [[NSMutableArray alloc] initWithObjects:@"test1",@"test2",@"test3",@"test4",@"test5",@"test6",@"test7",@"test8", nil]; 

// usernameTF.keyboardType = UIKeyboardTypeEmailAddress; 

    [usernameTF becomeFirstResponder]; //get first focus when the app stars 
    //set return key on the keyboard and the delegate for an action 
    usernameTF.returnKeyType = UIReturnKeyNext; // type of the return key 
    passwordTF.returnKeyType = UIReturnKeyGo; 
    //set delegate to connect with a method "-(BOOL)textFieldShouldReturn:(UITextField *)textField" 
    usernameTF.delegate = self; 
    passwordTF.delegate = self; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{  
    // Return YES for supported orientations 
    return YES; 
} 

@end 

的ChooseCameraRVC.h:

#import <UIKit/UIKit.h> 

@interface ChooseCameraRVC : UINavigationController <UINavigationControllerDelegate> 

@property (nonatomic, retain) IBOutlet UIBarButtonItem *zurueckBN; 

-(IBAction)exitToLoginView:(id)sender; 

@end 

的ChooseCameraRVC.m:

#import "ChooseCameraRVC.h" 
#import "NetCoWatchAppDelegate.h" 
#import "ChooseCameraCell.h" 

@implementation ChooseCameraRVC 

@synthesize zurueckBN; 

-(IBAction)exitToLoginView:(id)sender{ 
#warning Eventually logout the User. 

    //change the view 
    [((NetCoWatchAppDelegate*)[[UIApplication sharedApplication] delegate]) changeView:self:NO]; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{  
    // Return YES for supported orientations 
    return YES; 
} 

@end 

ChooseCameraVC.h:

#import <UIKit/UIKit.h> 

@interface ChooseCameraVC : UITableViewController <UITableViewDelegate> 

@end 

和ChooseCameraVC.m:

#import "ChooseCameraVC.h" 
#import "ChooseCameraCell.h" 
#import "NetCoWatchAppDelegate.h" 

@implementation ChooseCameraVC 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return YES; 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
#warning Customize the number of sections if grouped. 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
#warning Get count of cameras out of the data base. 
    return 5; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    // Configure the cell... 
    cell.textLabel.text = @"Camera"; 
    return cell; 
}  

@end 

我希望你能找到問題。

問候。$ H @ RKY

回答

2

現在我發現我錯了。因爲你可以看到我有作爲應用程序代理變量的意見。所以如果第二個視圖改變了方向,其他人不知道它的一些事情。如果視圖現在改變了「新」視圖,則在動畫之後識別方向改變,所以當動畫正在運行時,「新」視圖具有錯誤的方向。

所以,如果你想切換視圖,只需創建一個新的視圖,因爲它被正確的方向初始化。

親切的問候 $ h @ rky

0

對於支持所有方向的視圖 - 控制應實現shouldAutorotateToInterfaceOrientation這樣的:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

每個視圖 - 控制應實現對需要支持的方向這個方法。

另請查看Supported interface orientations項目.plist文件。也許你有錯誤的參數。

+0

全部完成之前。它的工作真的很好,如果你看着自己的觀點。但是如果你改變方向並切換到另一個視圖,那麼它在動畫之後自動旋轉,這看起來很糟糕。 – Sharky

+0

嗯,試着用塊做動畫:'[UIView animateWithDuration:0.4f動畫:^ {_myView.frame = fullRect; }];' – beryllium

+0

nope - 除動畫持續時間外沒有任何變化。 – Sharky

0

試試這個在您的secondviewcontroller

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
UIViewController *controller = [self.navigationController.viewControllers objectAtIndex:0]; 
[controller shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 

return YES; 
} 

希望工程.. !! :)

+0

不行。第一個視圖只是UIViewController中的一個UIView,所以沒有連接到第二個視圖。也許這就是問題!?! – Sharky