Center UIButton programmatically

2020-02-11 09:30发布

问题:

I have a UIButton which i add programmatically. No problems here, it stetches as it should and looks good. However, when I tilt the phone to landscape the button gets out of place, and I want it still centered.

Portrait:

Landscape:

I have tried a bunch of thing but cannot seem to get it working, it seems to me that the autoresizing should take care of it, however... it doesn't work in that case.

- (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 49)];

    _notMeButton = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *butImage = [[UIImage imageNamed:@"notme.png"] stretchableImageWithLeftCapWidth:6 topCapHeight:6];
    UIImage *butImagePressed = [[UIImage imageNamed:@"KC_notmePressed.png"] stretchableImageWithLeftCapWidth:6 topCapHeight:6];
    [_notMeButton setBackgroundImage:butImage forState:UIControlStateNormal];
    [_notMeButton setBackgroundImage:butImagePressed forState:UIControlStateHighlighted];
    [_notMeButton setTitle:NSLocalizedString(@"Change address", @"KlarnaCheckout") forState:UIControlStateNormal];
    [_notMeButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal];
    [_notMeButton setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];
    [_notMeButton setTitleShadowColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_notMeButton.titleLabel setShadowColor:[UIColor whiteColor]];
    [_notMeButton.titleLabel setShadowOffset:CGSizeMake(0, 1)];
    [_notMeButton.titleLabel setFont:[UIFont systemFontOfSize:14]];
    [_notMeButton addTarget:self action:@selector(thisIsNotMe) forControlEvents:UIControlEventTouchUpInside];
    [_notMeButton setTag:1];
    [_notMeButton sizeToFit];
    [_notMeButton setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
    [_notMeButton setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
    [_notMeButton setFrame:CGRectMake(10, 10, _notMeButton.frame.size.width+20, _notMeButton.frame.size.height)];
    [_notMeButton setCenter:footerView.center];

    [footerView addSubview:_notMeButton];

    return footerView;
}

回答1:

Your idea about autoresizing mask is right, but you're setting it incorrectly:

[_notMeButton setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
[_notMeButton setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];

The second line overwrites what you set in the 1st. Correct way to set several flags will be:

[_notMeButton setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];


回答2:

One thing before I answer your question:

[_notMeButton setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
[_notMeButton setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];

The second sentence overwrites the first one, you should use the | operator so both resizing mask are applied:

[_notMeButton setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];

To keep the element where it is when the view changes its size, you need to tell it not to use any resizing mask:

[_notMeButton setAutoresizingMask:UIViewAutoresizingNone];

And the equivalent in Interface Builder is this:

I hope it helps