当UIView框架改变iPhone iPad的尺寸时执行方法

时间:2011-07-13 22:42:16

标签: iphone objective-c ipad

我正在处理的nib文件中有一个UIView控件。在那个UIView我能够放置其他nib文件。当iPad旋转时,-(void)deviceOrientationChanged:(NSNotification *)note{方法会被执行,我会根据iPad进入横向或纵向模式调整UIView的大小。在子类(UIView控件中的nib文件)中,我需要知道iPad是否进入了限制模式或纵向模式。 Bellow是一张图片,展示了包含UIView控件的nib文件以及包含另一个nib文件的UIView控件:

enter image description here

绿色矩形是一个UIView控件,在里面我放了另一个xib文件。

所以我放置了同一个委托- (void)deviceOrientationChanged:(NSNotification *)note{。当我这样做的问题是,有时子视图委托得到执行而另一个代表没有。这只发生在真正的iPad而不是模拟器中。如果iPad进入横向模式,我希望两位代表都能执行。大多数情况下这不是问题,但如果我稍微倾斜iPad,只会有一名代表被执行。这就是为什么我在考虑调整子帧的方法时调整子类的方法。另外我知道我可以从绿色nib文件调用一个方法,但这就像一个powerpoint演示文稿,其中有大约60张幻灯片,因此我只是改变视图的dinamicaly。在c#中,我可以使用反射调用动态数据类型的方法。如果iPhone有类似的东西,我不知道。

简而言之,我希望两位代表(我正在使用的NIB文件中的一个和THE UIVIEW CONTROL的副本)在同一时间执行。

1 个答案:

答案 0 :(得分:0)

BOOL myBool;

// this function get's called when the orientation of the ipad changes
- (void)deviceOrientationChanged2:(NSNotification *)note{

    // do not call this method untill other method finish executing it...
    if(myBool==YES)
        return;

    myBool=YES;


    // wait half a second then call handlerTimer method
    NSTimer *timer;
    timer = [NSTimer scheduledTimerWithTimeInterval: (.5)
                                             target: self
                                           selector: @selector(handleTimer:)
                                           userInfo: nil
                                            repeats: NO];
}

-(void) handleTimer:(NSTimer*)theTimer{

    // this method just uses a diferent image on landscape mode compared to portrait mode


    // if the image is in landscapemode for example and it is the one for landscape then don't change its alpha the image will not be changed
    if( (imgTextbox.image == [UIImage imageNamed:@"introPaswordVertical.png"] && [super view].frame.size.width>800) || (imgTextbox.image == [UIImage imageNamed:@"introPasswordHorizontal.png"] && [super view].frame.size.width<800))
    {
        imgTextbox.alpha = 0;
    }


    // if the super view is in portrait mode then place the vertical image
    if([super view].frame.size.width<800)
    {
        imgTextbox.image = [UIImage imageNamed:@"introPaswordVertical.png"];
    }
    else // otherwise place the otherone
    {
        imgTextbox.image = [UIImage imageNamed:@"introPasswordHorizontal.png"];

    }

    // animate the image
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.55];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    imgTextbox.alpha = 1;
    [UIView commitAnimations];

    myBool=NO;  // enable deviceOrientationChanged2 to be called again
}