当 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 的框架