1

我面临着在设备方向到位的情况下异步更新 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];

}

在初始化方法中,我实际上使用如下代码异步更新 UI

 [self performSelectorOnMainThread:@selector(arrangeAsynchronously) withObject:nil waitUntilDone:NO];
- (void) arrangeAsynchronously{
    //Some complex calculation and finally
[self.view addSubview:imageview];
}

问题是当方向改变的图像视图没有添加到主视图时。假设我从纵向视图开始,然后我可以在纵向视图中看到所有图像视图,如果它变为横向,则视图为空白。同样,如果我切换到纵向,则所有子视图(即 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);

但是我仍然不知道为什么仿射变换不起作用waitUntilDone:NO并且在waitUntilDone:YES中起作用。

4

1 回答 1

0

你的策略有点问题。self.view以某种方式呈现,仅仅因为您制作了一个 new UIView,并不意味着它会在呈现的窗口中被替换。

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

编辑

我的回答可能看起来有点不清楚,所以让我试着更详细地解释一下。a的UIViewaUIViewController由 a 表示UIWindow。这意味着窗口具有对视图的引用。当您更改UIViewa 的UIViewController(通过构造一个新的UIView)时,并不意味着它将反映在UIWindow.


初始场景:

UIViewController-> UIView1 <-UIWindow

构建新的 UIView 后:

UIViewController-> UIView2
UIWindow-> UIView1


正如您在上图中看到的,您没有生成任何错误,但是您现在有两个视图,并且您所做的更改UIViewController不会反映在屏幕上。

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

这就是事情可能真正起作用的情况:


初始场景:

*UIViewController-> UIView1

构建新的 UIView 后:

*UIViewController-> UIView2

窗口在屏幕上显示视图:

UIViewController-> UIView2 <-UIWindow


基本上你不应该在它被展示后扔掉你的把手UIViewUIViewController

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

于 2012-07-01T10:36:42.630 回答