Sanandrea
Sanandrea

Reputation: 2194

UIButton does not show up in custom UIView

I am banging my head on this but cannot figure out the issue.

I have a custom UIView: FKPoiMiniDetail and this is the implementation (FKPoiMiniDetail.m)

const static CGFloat kDialogLateralMargin   = 15.0;
const static CGFloat kDialogHeight          = 100.0;
const static CGFloat kDialogBottomMargin    = 10.0;
const static CGFloat kBottomButtonHeight    = 50.0;

@interface FKPoiMiniDetail ()
@property (nonatomic) float tabBarHeight;
@property (nonatomic) NSUInteger numberOfButtons;
@property (nonatomic) NSMutableArray *buttonBlocks;
@property (strong, nonatomic) PoI* myPoi;

@end
@implementation FKPoiMiniDetail

- (id) initWithTabBarHeight:(float)aTabBarHeight numberOfButtons:(NSUInteger)numButtons andPoi:(PoI*)aPoi{
    if (self = [super init]) {
        self.tabBarHeight = aTabBarHeight;
        self.numberOfButtons = numButtons;
        self.myPoi = aPoi;
        self.buttonBlocks = [[NSMutableArray alloc] init];
        [self configure];
    }
    return self;
}

and here I add the the buttons programmatically:

- (void) assignButton:(NSUInteger)index anImage:(UIImage*)image aText:(NSString*)text andCallback:(void(^)())cb{
    if (index > self.numberOfButtons) {
        ALog("ERROR: Index is greater than number of buttons");
        return;
    }
    [self.buttonBlocks addObject:cb];

    int imWidth = 20;
    int imHeight = 20;
    int imLabelSpacing = 8;
    CGSize labelSize = [text sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
    CGFloat overallWidth = labelSize.width + imWidth + imLabelSpacing;

    CGFloat test = self.bounds.size.width;
    CGFloat buttonWidth = test / ((CGFloat) self.numberOfButtons);

    int x = index * buttonWidth;

    int y = self.frame.size.height - kBottomButtonHeight;

    UIButton *buttonContainer = [[UIButton alloc] initWithFrame:CGRectMake(x,y,buttonWidth,kBottomButtonHeight)];
    [buttonContainer addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside];
    buttonContainer.tag = index;


    int firstImOrigin = x + (buttonWidth - overallWidth) / 2;
    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(firstImOrigin, (kBottomButtonHeight - imHeight)/2, imWidth, imHeight)];
    [iv setImage:image];
    [buttonContainer addSubview:iv];


    CGRect lR = CGRectMake(firstImOrigin + imWidth + imLabelSpacing, (kBottomButtonHeight - labelSize.height)/2, labelSize.width, labelSize.height);

    UILabel *label = [[UILabel alloc] initWithFrame:lR];
    label.text = text;

    [buttonContainer addSubview:label];
    [self addSubview:buttonContainer];
}

and this is the selector as the target of the UIButton:

- (void)buttonTouched:(UIButton*)b{
    void (^ myblock)() = [self.buttonBlocks objectAtIndex:b.tag];
    myblock();
}

Somewhere else I create this object and assign buttons like this:

FKPoiMiniDetail *md = [[FKPoiMiniDetail alloc] initWithTabBarHeight:self.tabBarController.tabBar.frame.size.height
                                                            numberOfButtons:2
                                                                     andPoi:annotation.aPoI];
UIImage *im = [UIImage imageNamed:@"detail.png"];
[md assignButton:0 anImage:im aText:@"Dettagli" andCallback:^{
     ALog("Button 0 pressed");
}];

[md assignButton:1 anImage:im aText:@"Naviga" andCallback:^{
     ALog("Button 1 pressed");
}];
[self.mapView addSubview:md];

The second button is empty, but the strange thing is this: clicking inside the button the callback does execute...

enter image description here

Debugging seems useless: The variables for the first button:

enter image description here

and the variables for the second button:

enter image description here

Any help is appreciated, thanks in advance!

Upvotes: 1

Views: 730

Answers (2)

Larme
Larme

Reputation: 26096

"Decomposing" your FKPoiMiniDetail

FKPoiMiniDetail

View
buttonContainer1 - buttonContainer2 — buttonContainer3, etc

So what's inside a buttonContainer should always have the same "frames" whereas it's buttonContainer frame that changes, according to the number of buttons, since buttonContainer will be their superview.

So you declare:

int x = index * buttonWidth;
int y = self.frame.size.height - kBottomButtonHeight;

The'll help setting the buttonContainer frame.

But label and iv should not depend of them, only depend of the height and the width of [buttonContainer frame] since they seems to be centered.

I guess that from you code, if you do at the end [self addSubview:iv] and [self addSubview:label]; you may see them.

Upvotes: 1

Callistino
Callistino

Reputation: 1085

I've had problems with setting images on UIImageView in the past and my solution has been changing the order to this:

[buttonContainer addSubview:iv]; [iv setImage:image];

First adding he subview and then setting the image.

Upvotes: 0

Related Questions