Calling different UIView .xibs in a UIView contained in a UIViewController - ios

I have a UIView (containingView) inside a UIViewController (onboardingViewController).
I have 3 xibs that are UIViews and I want to sequentially call each xib UIView into the containingView that is placed in the onboardingViewController.
So my question is that, how do I reference each xib to call show it in containingView?
I've tried placing the views in an array and then add them to the subview of containingView but I am not able to view them when I run the application.

Sounds like you first want to load the views from your xib files programmatically and add them to your containerView.
// Load the UIViews from your Xib files
UIView *view1 = [[[NSBundle mainBundle] loadNibNamed:#"MyView1" owner:self options:nil] objectAtIndex:0];
UIView *view2 = [[[NSBundle mainBundle] loadNibNamed:#"MyView2" owner:self options:nil] objectAtIndex:0];
UIView *view3 = [[[NSBundle mainBundle] loadNibNamed:#"MyView3" owner:self options:nil] objectAtIndex:0];
// Now that you have references to your xibs, add them as subviews to your containingView
[containingView addSubview:view1];
[containingView bringSubviewToFront:view1];
// repeat as you need to load views 2 and 3

Related

Size classes not working when loading xib

I have a custom view, that I load like this:
MyCustomView *my = [[NSBundle mainBundle] loadNibNamed:#"MyCustomView" owner:self options:nil][0];
my.translatesAutoresizingMaskIntoConstraints = NO;
[view addSubview:my];
//add constraints to make it fill superview
Problem is, on iPhone it only shows the size class Any|Any, ignoring all constraint changes I put in Compact|Regular.
Should I do anything else to make it read correctly the size classes on my xib file?

ios loadNibNamed to Superclass

I have got a view.xib file with a CustomClass = "BaseClass" (I configure it on XCode editor), so I can do that:
BaseClass *mBassClass= [[[NSBundle mainBundle] loadNibNamed:#"view" owner:self options:nil] objectAtIndex:0];
But I want to know how I can do that:
I would have got a child class from BaseClass. For example ChildClass extends from BaseClass, and load a view from Nib but with a ChildClass
ChildClass *aChild = [[[NSBundle mainBundle] loadNibNamed:#"view" owner:self options:nil] objectAtIndex:0];
ChildClass2 *anotherView = [[[NSBundle mainBundle] loadNibNamed:#"view" owner:self options:nil] objectAtIndex:0];
So, I want to have got BaseClass with some child class with specific functions but all of these views have got the same Nib file
In my case I'm developing the following views:
(1) A nib file, it has got some uibutton from control and a UIView that will contain a Core Plot Graph
(2) A BaseClass, called GraphView, it matchs with the nib file and it does function with the uibuttons.
(3) Some child class, each one paint a different graph/plot on the UIView, but the inherits the functions of uibutton controls.
Any suggestion? Thanks
Create your XIB as the container for the graph. It contains all of the common views and functionality, but not the graph specific content.
Now, when you load the NIB, you will always get a BaseClass instance. Indeed, you must always get a BaseClass - you can not change the class that is unarchived from the NIB.
Your graph views shouldn't be subclasses of BaseClass. Your graph view class that is appropriate to the current situation should then be instantiated and added as a subview of the container view, which is owned by the BaseClass (container) instance.
If the graph view needs to change the common button status then you should provide the graph view with a reference to the BaseClass instance when you add it as a subview.

Add UIView from xib to UIScrollView

I am making an application, and I started with a single view controller with one view inside. I made my app but I want to have multiple pages and allow the user to swipe between them. I want to use a UISCrollView. How can I set up a UIScrollView so that I can insert my already made view from the xib. I don't want to make a view programmatically because a lot of it is graphical and I don't really know what I'm doing.
Recap: UIScrollView to swipe between views I have made in xib files
in your main view controller, add a scrollview. You can add scrollview to mainview in Xib.
In mainview controller .h file add a property , then load programmatically your views and add to scroll. Set each view position. Set scrollview reference in your main xib properly.
#property(nonatomic, weak) IBoutlet UIScrollView *scrollView;
UIView *view1 = [[NSBundle mainBundle] loadNibNamed:#"myViewXib1" owner:self options:nil];
UIView *view2 = [[NSBundle mainBundle] loadNibNamed:#"myViewXib2" owner:self options:nil];
UIView *view3 = [[NSBundle mainBundle] loadNibNamed:#"myViewXib3" owner:self options:nil];
CGRect frame;
frame = view1.frame;
frame.origin.x = 0;
view1.frame = frame;
frame = view2.frame;
frame.origin.x = view1.frame.size.width + view1.frame.origin.x ;
view2.frame = frame;
frame = view3.frame;
frame.origin.x = view2.frame.size.width + view2.frame.origin.x;
view3.frame = frame;
[scrolView addSubView:view1];
[scrolView addSubView:view2];
[scrolView addSubView:view3];
Declare IBOutlet in your view controller to point to that view.
#property(nonatomic, weak) IBoutlet UIView *myView;
Connect your view from xib to myView.
Load your xib in the view controller viewDidLoad method
[[NSBundle mainBundle] loadNibNamed:#"myViewXib" owner:self options:nil];
Then add myView to your scrollview.

Loading a View programatically in to a UIViewController

I have 2 questions actually. First I'll explain the scenario. I have a simple Storyboard app. The first controller is a UITableViewController displaying a list of mail types. When tapped upon a cell, it segues to a UIViewController and depending on the selected mail type, it loads a UIView into the UIViewController. This is all working fine. My problems are,
One UIView I have is 559 in height. I put a UIScrollView inside the UIViewController so that when the UIView with the extra height is loaded, it'll be scrollable. But instead of that happening, the UIView resizes to the size of the UIViewController. How can I keep its original height and embed it inside a UIScrollView?
From the Interface builder, I've put a UIToolbar at the bottom of the UIViewController. But when the UIView is loaded into it, the UIToolbar disappears. I guess the UIView appears on top of the UIToolbar(?). How can I avoid this from happening?
I know this must a bit confusing to understand. Therefore I've uploaded an Xcode project demonstrating the 2 issues here.
Please have a look and tell me what I should do.
Thank you.
I see a couple problems with what you're doing in your project that may explain why you're getting these results.
In NewMailViewController.m, you are replacing the view you've created in the storyboard (the one that has a scroll view and a toolbar) with the one you've loaded from the nib (i.e. self.view = [nib objectAtIndex:0];). Try doing this in -loadView
[super loadView];
UIView *someView = nil;
if ([self.mailTypeName isEqualToString:#"Email"]) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"Email" owner:self options:nil];
someView = [nib objectAtIndex:0];
}
else if ([self.mailTypeName isEqualToString:#"Facsimile"]) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"Facsimile" owner:self options:nil];
someView = [nib objectAtIndex:0];
}
else if ([self.mailTypeName isEqualToString:#"Memorandum"]) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"Memorandum" owner:self options:nil];
someView = [nib objectAtIndex:0];
}
else if ([self.mailTypeName isEqualToString:#"ProjectMemo"]) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"ProjectMemo" owner:self options:nil];
someView = [nib objectAtIndex:0];
}
CGRect frame = someView.frame;
frame.size.width = self.myScrollView.frame.size.width;
[someView setFrame: frame];
[self.myScrollView addSubview: someView];
[self.myScrollView setContentSize: someView.bounds.size];
You'll notice that I have a reference to the scroll view in the above snippet of code. You'll want to create an outlet for the scroll view in your NewMailViewController class so that you can refer to it as needed. It involves putting this in your header file:
#property (strong, nonatomic) IBOutlet UIScrollView *myScrollView;
You'll need to connect the defined outlet to the actual storyboard's scroll view. You can search for "creating or connecting outlets in Xcode" on the Internet for more information about that.
The toolbar appears to be a subview of the scroll view. Don't you want the toolbar to rest at the bottom of the view while the content of the scroll view scrolls? If so, you'll want to move that toolbar view out from within the scroll view.
Here are the changes: http://www62.zippyshare.com/v/90505016/file.html

Add a subview in xib to a custom UIView

First, I have a exist Asset.m/Asset.h, it is the subclass of UIView. Then I create a empty xib file and change xib's file's owner class to Asset. Then I create a view and a label to this xib, and I can drag and create IBOutlet in UIView.
IBOutlet UIView *videoOverlay;
IBOutlet UILabel *videoTimeLable;
Then I want to add videoOverlay to Asset.m's view using addSubview.
self = [super initWithFrame:CGRectMake(0, 0, 0, 0)];
[self addSubview:videoOverlay];
But the view -- videoOverlay do not show up.
I print out size of videoOverlay, all 0:
NSLog(#"width =%f height= %f", videoOverlay.frame.size.width, videoOverlay.frame.size.height);
Why ?
Finally, I find the solution by myself. Use under code to add this view (videoOverlay and videoTimeLable belong to this view )in:
UIView *thumbs;
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"ELCAsset" owner:self options:nil];
thumbs = [nib objectAtIndex:0];
[self addSubview:thumbs];
then videoOverlay and videoTimeLable can show up.

Resources