Bernd
Bernd

Reputation: 11533

How to position a View as Subview?

I want to position a view (red box with label and button) prepared in IB as Subview on the screen programmatically. The positioning works fine with the "blue lines" (there might actually be a better way to simply draw a line on a view?!). But the view of the "AttributeApertureView" view object sticks to the top instead of following the initFrame Parameter starting at y=60 as you can see in the screenshot.

    //Add blue Line
CGRect lineB = CGRectMake(0, 48, bounds.size.width, 0.5);
UIView *secondLine = [[UIView alloc]initWithFrame:lineB];
[secondLine setBackgroundColor:[UIColor colorWithRed:0.396 green:0.796 blue:0.894 alpha:1]];
[[self view]addSubview:secondLine];


//Add Attribute Aperture
AttributeApertureView *aperture = [[AttributeApertureView alloc]initWithFrame:CGRectMake(0, 60, bounds.size.width, 50)]; 
[aperture setBackgroundColor:[UIColor redColor]];
[[self view]addSubview:aperture];

Init function in AttributeApertureView class. This should basically only load the related nib file with the IB Interface.

@implementation AttributeApertureView

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    NSArray *nib = [[NSBundle mainBundle]loadNibNamed:@"AttributeApertureView"
                                                owner:self
                                              options:nil];
    self = [nib objectAtIndex:0];
}
return self;
}

enter image description here

What is the best way to position the "aperture" view on the screen?

Upvotes: 0

Views: 466

Answers (1)

rosslebeau
rosslebeau

Reputation: 1283

Seems like calling loadNibNamed: resets the view's frame to what it is in the nib. This should work:

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    NSArray *nib = [[NSBundle mainBundle]loadNibNamed:@"AttributeApertureView"
                                            owner:self
                                          options:nil];
    self = [nib objectAtIndex:0];
    self.frame = frame;
}
return self;
}

because self = [super initWithFrame:frame]; sets the frame once, but self = [nib objectAtIndex:0]; ends up changing it again because you are resetting the whole view, so you have to set the frame again to be the one in the argument.

Upvotes: 1

Related Questions