views:

36

answers:

1

I have a uitabbarcontroller which has one UIViewController added to it. (I reduced to smallest case possible). This viewcontroller calls up a UIView which draws a UIButton via:

- (void)drawRect:(CGRect)rect 
{
    CGRect brect = CGRectMake(0, 330, 60, 27);
    CGPoint centern=CGPointMake(CGRectGetMidX(brect), CGRectGetMidY(brect) );
    UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button setFrame:brect];
    [button setCenter:centern];
    [button setTitle:@"New" forState:UIControlStateNormal];
    [self addSubview:button];
 }

The button is drawn without the inside text. Only when I touch the display is it then drawn properly.

My solution has been the following: Give the tab-bar controller two UIViewControllers to control. Then force a draw of the second one, and then back to the first one:

tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:1];
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:0];

This solution works, but it's a stupid hack. Is there a better way to do this?

A: 

The code you posted dosen't seem to fit inside a drawRect: implementation. You should add this code to your views init implementation, or to your viewControllers loadView or viewDidLoad implementation.

These two lines do not do anything useful you can leave them out:

CGPoint centern=CGPointMake(CGRectGetMidX(brect), CGRectGetMidY(brect) );
[button setCenter:centern];

Whenever you set a frame on a view, the views center is implicitly set to the frames midpoint(center).

tonklon
downvote without comment? Where am I wrong?
tonklon