当 UIView 框架改变其大小时执行方法 iPhone iPad

Posted

技术标签:

【中文标题】当 UIView 框架改变其大小时执行方法 iPhone iPad【英文标题】:Execute method when UIView frame changes its size iPhone iPad 【发布时间】:2011-07-13 22:42:16 【问题描述】:

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

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

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

简而言之,我希望两位代表(我正在使用的 NIB 文件和 UIVIEW 控件的 SUBVIEW 中的一位)同时执行。

【问题讨论】:

【参考方案1】:
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

【讨论】:

以上是关于当 UIView 框架改变其大小时执行方法 iPhone iPad的主要内容,如果未能解决你的问题,请参考以下文章

动画父 UIView 的框架(大小)时自动调整 UILabel 的框架

动态改变 UITableView 高度

iOS:UIView 在动画时改变大小,我该如何防止?

旋转的 UIView 变得无响应

当 UILabel 动态调整大小时,在 UIView 中移动 UIButton。 iOS

UIView 内的 MKMapView 框架没有改变