更多视图和控制器(iPad)的方向问题

时间:2011-09-15 06:57:25

标签: objective-c xcode ipad orientation

我正在使用Orientation为iPad编写应用程序。 App-Delegate.h有一个窗口,一个UIViewController,一个UINavigationController和一个UITabbarController:

@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


确定。我准备好了我的源代码。

注意:我没有复制只有[super ...]的方法或完全注释掉的方法。

首先是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

3 个答案:

答案 0 :(得分:2)

现在我发现了我的错误。你可以看到我将视图作为app delegate中的变量。因此,如果第二个视图改变了方向,那么其他视图就不知道它是什么。如果视图现在更改“新”,则可以在动画之后识别方向更改,因此在动画运行时,“新”视图的方向错误。

因此,如果您想要切换视图,只需创建一个新视图,因为它以正确的方向初始化。

亲切的问候 $ H @ RKY

答案 1 :(得分:0)

为支持所有方向,您的viewcontroller应该像这样实现shouldAutorotateToInterfaceOrientation

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

每个viewcontroller都应该为支持所需的方向实现此方法。

同时检查Supported interface orientations文件中的.plist项。也许你有错误的参数。

答案 2 :(得分:0)

secondviewcontroller

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

return YES;
}  

希望它有效.. !! :)