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.
Related
I created a UIView in a separate subclass of UIView and with an xib.
I have a UIViewController with a UIView in storyboard and I want to set custom UIView to this UIView.
I modified class name in storyboard UIView to the class name of custom UIView. I am getting the UIView on the result but with the frame size of custom UIView. I added correct constraints in the custom xib. and some touch gestures not working as desired because of the wrong frame etc.
Please suggest me if anything wrong I did.
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Load the UIView from Interface Builder
[[NSBundle mainBundle] loadNibNamed:#"TMPhotoEdit" owner:self options:nil];
// Add UIView to current UIView object.
[self addSubview:self.view];
}
return self;
}
self.view is the same view object I created a variable for it.
I want the frame to set as same as the one i am using in storyboard.
Solution to get it work using code also helps me a lot. I mean, without IBOutlet in storyboard, just adding this UIView with some frame set to it.
If I call initWithFrame, I can't set the xib like what I am doing with initWithCoder above and initWithCoder is not being called if I use initWithFrame in code.
Assuming you have an instance of the view you want to resemble in size
self.view.frame = CGRectMake(otherView.frame.x, otherView.frame.y, otherView.frame.width, otherView.frame.height);
Actually what you are doing is not correct but anyway you should load the custom view nib like this
self.view = [[NSBundle mainBundle] loadNibNamed:#"TMPhotoEdit" owner:self options:nil][0];
Again this is not correct, why do you need it anyway? but it shall solve your nib loading issue.
I have a problem with UILabel and UIView. In my UIViewController I load a UIView:
NSArray *first = [[NSBundle mainBundle] loadNibNamed:#"customView" owner:self options:nil];
UIView *detail = [first objectAtIndex:0];
Inside the Xib of the UIView that i have already loaded (#"customView") there is a UILabel. How can i load also this UILabel and change the text?
Thanks
If in the XIB the root view has a subview then that is also loaded when you load the XIB. You have a few options for connecting to it:
Add an outlet to the file owner in the XIB (this is your view controller)
Add an outlet to the root view that the view controller can use to get the label
Use the tag on the label and viewWithTag: to search for it
Arguably option 2 is the best from that list as it is the best containment of knowledge and the most reusable.
You can tag the UILabel inside of the .xib file and then access the UILabel like this:
(Assume you have tagged the UILabel 42)
UILabel *label = [detail viewWithTag:42];
You can then change the text as you would with any other UILabel:
label.text = #"Text for the label";
In the XIB file you can create an outlet to the file's owner. Then you can access the property of the view controller, since it is the file's owner of the XIB (set in your first line of code).
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.
I have a view created in xib with UIImageviews and UILabel as the subviews. From my code, is it possible to create a new view object every time i run a loop.Please help me.
You need to create a new custom view named CustomView
Select class in XIB to CustomView.
Then load XIB name to a View object and can use in a loop
CustomView *aView = [[[NSBundle mainBundle] loadNibNamed:#"YourXibName" owner:nil options:nil] objectAtIndex:0];
When you have created a view and hooked it up via interface builder you can easily add views like
for(int i = 0; i < numberOfIterations; i++){
UIView * newView = [[UIView alloc] initWithFrame:MyFrame];
[myInterfaceBuilderView addSubview:newView];
}
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