Question

I'm creating compatibility for iOS6 for an app made by someone else. I'm used to using making buttons/UI elements with autoresizing masks but I don't really know how they work when you're creating the button programatically.

For example:

- (UIButton*) createSampleButton {
    UIButton* b = createSampleViewButton(CGRectMake(67, 270, 191, 45), 
                                          @"btn_shuffle", 
                                          @"btn_shuffle_active",
                                          self,
                                          @selector(sampleAction));
    b.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
    [self attachButton:b];
    return b;
}

How can I change these buttons such that they'll be placed according to some scale/margin instead of arbitrarily choosing points until everything "looks right" ?

I was thinking of something like:

- (UIButton*) createSampleButton {
    CGFloat height = self.bounds.size.height;
    CGFloat bottomBound = 80;
    UIButton* b = createSampleViewButton(CGRectMake(67, height-bottomBound, 191, 45), 
                                          @"btn_shuffle", 
                                          @"btn_shuffle_active",
                                          self,
                                          @selector(sampleAction));
    [self attachButton:b];
    return b;
}

This would guarantee me that the button is placed 80 points from the bottom of the screen every time right? Is there a more graceful or purposeful way of doing this?

Was it helpful?

Solution

The masks are the same as when created in IB or code. The thing you want to make sure to do in code though is make sure the frames are set properly proportioned once. In your case, yes you do want UIViewAutoResizingFlexibleTopMargin, and setting the correct y-value on the origin in terms of y = parentView.bounds.size.height - (x points as you described), is all you need to do.

EDIT: According to your updated question, maybe this will help you. If the button has a constant size, set the frame to that size with CGPointZero as the origin when you create the button. If a UIView owns the button, then put this code in layoutSubviews. If a UIViewController owns the button, replace self.bounds with self.view.bounds and put this in view(Will/Did)LayoutSubviews (Assuming iOS5+).

    // Aligning the button at it's current x value, current size, with its bottom border margin pizels from the bottom of the parent view.
    CGFloat margin = 10;
    CGRect buttonFrame = button.frame;
    buttonFrame.origin.y = self.bounds.size.height - buttonFrame.size.height - margin;
    button.frame = buttonFrame;

Also, define constant values at the top of the implementation file. Feel free to create convenience methods for readability (if you find this more readable and not doing too much on one line) such as

    CGRect CGSetYInRect(CGFloat y, CGRect rect)
    ...
    button.frame = CGSetYInRect(self.bounds.size.height - button.frame.size.height - margin, button.frame);

Use AutoResizing when appropriate to avoid explicit logic in layoutSubviews.

When you move to iOS 6 + only, use AutoLayout.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top