目标c:使用设备方向异步更新UIView

时间:2012-07-01 08:57:36

标签: objective-c uiview asynchronous

我正面临着与设备方向异步更新UIView的问题。我在viewDidload中实现了设备方向,如下所示

- (void)viewDidLoad{
[super viewDidLoad];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged) name:UIDeviceOrientationDidChangeNotification object:nil];
[self initialize];}

在orientationChanged方法中,我有以下代码

-(void)orientationChanged {
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;

if(UIInterfaceOrientationIsLandscape(orientation)){
    UINib *nib = [UINib nibWithNibName:@"ConsoleViewControllerLandscape" bundle:nil];
    UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
    self.view = portraitView;

    [self initialize];

} else {
    UINib *nib = [UINib nibWithNibName:@"ConsoleViewController" bundle:nil];
    UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
    self.view = portraitView;

    [self initialize];

}

在initialize方法中,我实际上使用

等代码异步更新UI
 [self performSelectorOnMainThread:@selector(arrangeAsynchronously) withObject:nil waitUntilDone:NO];
- (void) arrangeAsynchronously{
    //Some complex calculation and finally
[self.view addSubview:imageview];
}

问题是当方向改变时,imageViews没有添加到主视图中。让我们说我从纵向视图开始,然后我可以在纵向视图中看到所有图像视图,如果它更改为横向,则视图为空白。再次,如果我切换到肖像,然后正确添加所有子视图,即imageViews。问题是当方向改变时,我正在加载一个新的nib文件,但代码仍然引用从旧的nob文件加载的旧视图。我该如何更改参考。只有在异步模式下才会出现此问题。

它与uiview没有问题,而是在设备旋转后计算子视图位置。早些时候我的代码是

CGAffineTransform inverseTransform = CGAffineTransformInvert(self.view.transform);
fixedPoint = CGPointApplyAffineTransform(fixedPoint,inverseTransform);
fixedPoint = CGPointMake(fixedPoint.x+126, fixedPoint.y-109);

我把它改成了

fixedPoint = CGPointMake(fixedPoint.x+126, fixedPoint.y-109);

但我仍然无能为力为什么affinetransform不起作用waitUntilDone:NO并且在waitUntilDone中工作:是。

1 个答案:

答案 0 :(得分:0)

你的策略有点问题。 self.view以某种方式呈现,只是因为您创建了一个新的UIView,并不意味着它会在显示的窗口中被替换。

我建议您将主容器视图添加到主UIView(此处替换的容器),然后在更改设备方向时更改容器视图的内容。

修改

我的回答可能看起来有点不清楚,所以让我试着更详细地解释一下。 UIView的{​​{1}}由UIViewController呈现。这意味着窗口具有对视图的引用。当您更改UIWindow的{​​{1}}时(通过构建新的UIView),这并不意味着它会反映在UIViewController中。


初始方案:

UIViewController->的 UIView1 < -UIWindow

构建新的UIView之后:

UIViewController->的 UIView2
 UIWindow->的 UIView1


正如您在上图所示,您不会产生任何错误,但您现在有两个视图,而UIView中所做的更改并未反映在屏幕上。

你可能很幸运它第一次工作:如果你重建UIWindow之前它由UIWindow呈现一切仍然有效,但它仍然是一个糟糕的设计,可能很容易破坏(如你看到时机改变了。)

事情可能确实有效:


初始方案:

* UIViewController->的 UIView1

构建新的UIView之后:

* UIViewController->的 UIView2

窗口显示屏幕上的视图:

UIViewController->的 UIView2 < -UIWindow


基本上,你应该在UIViewController UIView之后丢弃你的句柄。

我希望这有助于您理解引用/指针的工作原理。