I am facing problem updating UIView asynchronously with device orientation in place. I have implemented device orientation in viewDidload as below
- (void)viewDidLoad{
[super viewDidLoad];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged) name:UIDeviceOrientationDidChangeNotification object:nil];
[self initialize];}
In orientationChanged method, I have following code
-(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];
}
In initialize method, I actually update UI asynchronously with codes like
[self performSelectorOnMainThread:@selector(arrangeAsynchronously) withObject:nil waitUntilDone:NO];
- (void) arrangeAsynchronously{
//Some complex calculation and finally
[self.view addSubview:imageview];
}
The problem is when orientation changed imageViews are not added to main view. Lets say I am starting with portrait view then I can see all imageviews in portrait view and if it changed to landscape, then view is blank. Again if I switched to portrait, then all subviews i.e. imageViews are properly added. The problem is when orientation changed, I am loading a new nib file however the code still refers to old view loaded from old nob file. How can I change reference. This problem only occurs when I do in asynchronous mode.
Its not problem with uiview rather its with calculation of subview positions after device rotation. Earlier my code was
CGAffineTransform inverseTransform = CGAffineTransformInvert(self.view.transform);
fixedPoint = CGPointApplyAffineTransform(fixedPoint,inverseTransform);
fixedPoint = CGPointMake(fixedPoint.x+126, fixedPoint.y-109);
And I changed it to
fixedPoint = CGPointMake(fixedPoint.x+126, fixedPoint.y-109);
But still I am clueless why affinetransform does not work waitUntilDone:NO and works in waitUntilDone:YES.