我面臨的問題是設備方向就地異步更新UIView。我已經在viewDidLoad中實現的設備取向如下目標c:以設備方向異步更新UIView
- (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];
}
在初始化方法,我實際上異步地碼等
[self performSelectorOnMainThread:@selector(arrangeAsynchronously) withObject:nil waitUntilDone:NO];
- (void) arrangeAsynchronously{
//Some complex calculation and finally
[self.view addSubview:imageview];
}
更新UI問題是方向改變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工作:YES。
現在很酷的編碼器。我試圖幫助你。讓我試着解釋一下我所看到的與你的設計有關的問題;每次手機傾斜時,您都可以在視圖控制器中查看自己重新構建的視圖。但是在某處你有一個UIWindow或另一個視圖控制器,它仍然有一個對第一個視圖的引用。這意味着即使你構建了一個新的視圖,你也不會得到它。基本上說:你不應該在呈現之後重建UIViewController的視圖。我希望這可以澄清一點,也請儘量保持友好和藹的語調。 – EsbenB
感謝您的建議,我想解釋的是,當我使用[self performSelectorOnMainThread:@selector(arrangeAsynchronously)withObject:nil waitUntilDone:NO]更新視圖時會出現問題;但是當waitUntilDone:YES時,問題不會出現。這意味着,問題不是因爲View呈現,而是與線程有關。讓我知道它是否合理。 –
執行選擇器中waitUntilDone YES/NO的區別在於代碼將被執行,而不是執行該操作的線程。請嘗試我建議的解決方案。如果這沒有幫助,我們可以討論下一步。 – EsbenB