I have 2 UIWindows, when I show both UIWindows the latest shown UIWindow always is above the 1st shown UIWindow. Each UIWindow is an own UIWindow, so no Subview.
Does anyone know how i can place a UIWindow behind another UIWindow?
While I suspect there's probably a cleaner, more maintainable way to achieve what you want, you should be able to manipulate the order windows appear using the windowLevel property - although to be honest the last time I tried to do this was on iOS 5 so maybe that's changed. But generally you'd do something like:
windowToPlaceInFront.windowLevel = windowToPutInBack.windowLevel + 1.0f;
You cannot have multiple UIWindow inside an app.
From Apple documentation (https://developer.apple.com/library/ios/documentation/uikit/reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html):
Unless an app can display content on an external device screen, an app has only one window.
Related
I've seen a few questions about status bars and UIWindow, but none of them gave me a solution for this exact problem.
I'd like to make a UIWindow for showing in-app notifications/toasts that appear on top of everything. A UIWindow seems the right way to do this. However, the window affects the status bar. I'd like the status bar to be driven by the original window that contains the rest of the app. Any easy way to do this?
You shouldn't be creating a seperate UIWindow to achieve this. Instead make a Custom View subclassing UIView, do your work in it via code or a Nib. And add it as a subview to your Main Window. [[[UIApplication sharedApplication] keyWindow] addSubview:CustomView];
You can also use bringSubviewToFront to make sure it adds above all other subviews. But it isn't necessary, would be on front in almost all typical scenarios.
I have a problem using an UISplitViewController on iOS 8.
Specifically it crashes when rotating the screen, and this only occurs on the iPhone 6 Plus. I assume it happens when the controller tries to split/merge the view controllers.
My navigation stack can be a bit complex, both the left and right sides of the split view have a UINavigationController. And several items can be pushed on the left stack before switching to the right stack. It's really quite similar to the default mail app. Where you choose your mailbox, open folders and browse the mail list on the left stack, and show mail and open attachments and such on the right stack.
I was able to configure and connect how the different views behave using nothing but storyboard configuration by using Show (e.g. Push) to push on the left stack and Show Detail (e.g. Replace).
After clicking around (and filling the right stack), rotating on the iphone 6 plus will crash the app. I realised it happens because this is the only device expanding and collapsing the two sides onto each other. There's no real info given by the debugger, only thing I sometimes get is:
-[UIView updateNavigationBarButtonsAnimated:]: unrecognized selector sent to instance
Note where it says UIView, this seems to be random (NFCString, NSArray, etc), so I figured it's unexpectedly nil and points to the random code on the heap.
I also realise this has something to do with the UISplitViewControllerDelegate methods, but I just cannot figure out what I should really do to make it work.
I had the same issue.
My crash was caused by setting the leftBarButtonItem in viewDidLoad in a subclass of UISplitViewController. I deleted these two lines of code.
let navigationController = self.viewControllers[self.viewControllers.count-1] as! UINavigationController
navigationController.topViewController.navigationItem.leftBarButtonItem = displayModeButtonItem()
Now I set the leftBarButtonItem in prepareForSegue. That´s the way Apple does it in the Master/Detail example ;-)
"I also realise this has something to do with the UISplitViewControllerDelegate methods, but I just cannot figure out what I should really do to make it work."
You are right. I have the same problem and fix with this:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isMovingFromParentViewController) {
// To avoid deallocated problem with SplitVC delegates
self.splitViewController.delegate = nil;
// Do your stuff here
}
}
In other words, you must assign to nil the delegate of splitViewController when you screen disappear.
I hope this help you as me.
After upgrading my project to iOS7
when I do a BACK Button and the UINavigationController goes back to the previous page, an ImageView on the top of the screen shifts down.
I use IB to do my layouts. These are my Simulated Metrics:
I have AutoLayout off. Any ideas on what the issue might be? I wasnt sure if anyone wants to see specific code and I didnt want to clutter up the question with too much code.
Updates: Based on the comment questions, I wanted to make these updates:
In no place in the application .h or .m file do I make any changes to the imageview's sizes or location.
In both the viewDidLoad and viewDidAppear I call a user-defined method called recalculateAll but their is no reference at all to any imageview sizes. Just for trying it out I commented out the entire section and ran the code and it still jumps down.
In my init I do programatically set some imageviews (you see the #132 in what appears to be a bubble) using their x and y's.
Here is a typical navigation I use for moving from the view controller to the tableviewcontroller:
GetTimeOffByType *showTimeOffReport = [[GetTimeOffByType alloc] initWithNibName:#"GetTimeOffByType" bundle:nil];
showTimeOffReport.timeOffType = #"Vacation";
[self.navigationController pushViewController:showTimeOffReport animated:YES];
These are all .xib files, no storyboarding at all. Its basically a view controller which has an embedded UINavigationController with 6 buttons. Each time a button is pressed it pushes a UITableViewController passing different parameters and showing different data. The transition I am using to get back to the original UIViewController is simply the iOS generated BACK button (so no code to show for that)
Update#2 Hopefully this will help someone solve this wierd behavior. So if I were to click on the table view cell on showTimeOffReport to get the cell detail and then using BACK navigate all the way back it doesnt jump down.
Update#3 Ok this is something I just discovered : The issue of jumping down or not is related to the translucency of the UINavigationBar. If you have a Translucent = YES it will start from the top of the window. If you have a translucent = NO it will start from the bottom of the UINavigationBar.
You might try setting the new property on UIViewController edgesForExtendedLayout to UIRectEdgeNone.
Here is a good resource that explains more about how view layouts changed in iOS 7.
See Apple Documentation
If you plan to be backwards compatible you will probably need to do some runtime checks and adjust positioning if the device is not running iOS 7.
This might help you..You can try adding UIViewControllerBasedStatusBarAppearance key and set it's value NO in your info.plist
UIViewControllerBasedStatusBarAppearance = NO
I am trying to create an application with a feature similar to facebook's chat bubbles.
When the user navigates to a certain page (InCallViewController), they can connect to another person via video chat. When they navigate out of this page after connecting, I would like the video view to stay floating on the screen, but allow them to do what ever they want to do in the app.
In order to do this, I have made an InCallViewController class, which will allow the user to connect with the other person. Once connected, the video is displayed in a view. This view is movable (similar to facebook's chat bubbles) and displays the video chat perfectly, however when I exit the page and go to another page (AccountViewController) in the app, I am unable to keep this view on the screen. I have tried many things, including setting this view as a subview in the later pages. However when I do this, the subview is not displayed.
MyAccountView.m
- (void)viewDidLoad
{
[super viewDidLoad];
InCallViewController *inCallViewController = [[InCallViewController alloc] initWithNibName:#"InCallViewController" bundle:nil];
[self.view addSubview:inCallViewController.previewView];
[self.view bringSubviewToFront:inCallViewController.previewView];
(Do some other set up stuff)
}
InCallViewController.h
#interface InCallViewController : UIViewController <UIAlertViewDelegate>
{
CGPoint currentTouch;
NSArray *viewArray;
AVAudioPlayer *audioPlayer;
}
#property (weak, nonatomic) IBOutlet UIView *previewVideoView;
The previewView is a UIView in the InCallViewController class. This is hooked up in the IB, and works perfectly when in the InCallController class. The problem is, it won't show up when adding it as a subview in another class. I am wondering what I am doing wrong, or if there is a better way to keep the "previewView" remaining on the screen after I exit InCallViewController.
Thanks
You should consider implementing a container viewController. Since iOS6 and xcode 4.5 this has been made pretty straightforward.
The containing viewController can be handling your previewViews which are overlayed over whatever viewController is currently contained in it.
You can compare what you want to achieve with what Apple has achieved with a UInavigationController (also a container view controller): it contains viewController that are happily showing their content, but the navigationController makes sure the navigationBar is always present, for all viewControllers, even during animations.
Apple has some good documentation and even a WWDC session on this.
Hacking your way into [[UIApplication sharedApplication] keyWindow] is extremely poor design, and a blatant violation of the MVC pattern. It works, but it is a hack nonetheless and might give you headaches in the future.
You can add previewView to [[UIApplication sharedApplication] keyWindow] as a subview so that it appears on all your views and above each of them.
Short version:
I'm alloc/init/retaining a new UIViewController in one UIViewControllers viewDidLoad method, adding the new View to self.view. This usually works, but it seems to mess up orientation change handling of my iPad app.
Longer version:
I'm building a fairly complex iPad application, involving a lot of views and viewcontrollers. After running into some difficulties adjusting to the device orientation, I made a simple XCode project to figure out what the problem is.
Firstly, I have read the Apple Docs on this subject (a small document called "Why won't my UIViewController rotate with the device?"), and while I do believe it has something to do with one of the reasons listed there, I'm not really sure how to fix it.
In my test project I have an appDelegate, a rootViewController, and a UISplitViewController with two custom viewControllers. I use a button on the rootViewController to switch to the splitViewController, and from there I can use a button to switch back to the rootViewController. So far everything is great, i.e. all views adjust to the device orientation.
However, in the right viewController of the splitViewController, I use the viewDidLoad method to initialize some other viewControllers, and add their views to its own view:
self.newViewController = [[UIViewController new] autorelease];
[newViewController.view setBackgroundColor:[UIColor yellowColor]];
[self.view addSubview:newViewController.view];
This is where things go wrong. Somehow, after adding this view, adjusting to device orientation is messy. On startup everything is fine, after I switch to the splitViewController everything is still fine, but as soon as I switch back to the rootViewController it's all over. I have tried (almost) everything regarding retaining and releasing the viewcontroller, but nothing seems to fix it.
As you can see from the code above, I have declared the newViewController as a property, but the same happens if I don't.
Shouldn't I be adding a ViewController's view to my own view at all? That would really mess up my project, as I have a lot of viewControllers doing all sorts of things.
Any help on this would be greatly appreciated...
I had the same problem, seams resolved by removing from the parent view the "autoresize subview" option in IB.
Select the view a then: Inspector -> Attributes (first tab) -> drawing.
What I think is happening is that your new viewcontroller is getting the autorotation calls and probably not handling them. Meanwhile your old viewcontrollers and its views won't get the autorotation calls and will be stuck in whatever orientation they were in.
I can't tell, but I think what you want to do is to make a UIView and add it to your old viewcontroller, instead of making a UIVIewController and adding its view.