2015-02-20 3 views
1

Я ударяю головой об этом, но не могу понять проблему.UIButton не отображается в пользовательских UIView

У меня есть пользовательский UIView: FKPoiMiniDetail и это реализация (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; 
} 

и здесь я добавляю кнопки программно:

- (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]; 
} 

и это селектор, как цель UIButton:

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

Где-то еще я создаю этот объект и назначить кнопки, как это:

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]; 

Вторая кнопка пуста, но странно это: нажав внутри кнопки обратного вызова делает выполнить ...

enter image description here

Debugging кажется бесполезные: переменные для первой кнопки:

enter image description here

и переменные для второй кнопки:

enter image description here

Любая помощь приветствуется, спасибо заранее!

+0

Обновленные скриншоты отладки – Sanandrea

+0

Вы используете 'x', чтобы установить фрейм subview внутри buttonContainer, тогда как он, по-видимому, используется в реальном времени (как определено) со всей шириной вашего' FKPoiMiniDetail'. Другими словами, если я правильно понял, buttonContainer должен иметь как origin.x 145 для второй кнопки, но то, что внутри, должно иметь то же самое, что и для первой кнопки (firtImOrigin = 29) и т. Д. – Larme

+0

Да, может быть, я am fused – Sanandrea

ответ

1

"Разобрать" ваш FKPoiMiniDetail

FKPoiMiniDetail

Посмотреть
buttonContainer1 - buttonContainer2 - buttonContainer3 и т.д.

Так что находится внутри buttonContainer всегда должны иметь одни и те же "кадры" в то время как это buttonContainerframe, который изменяется, в соответствии с номером o f, так как buttonContainer будет их надзором.

Так вы объявляете: установка

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

The'll помощь в buttonContainerframe.

Но label и iv не должны зависеть от них, зависит только от высоты и ширины [buttonContainer frame], поскольку они, по-видимому, центрированы.

Я думаю, что от вас код, если вы делаете в конце [self addSubview:iv] и [self addSubview:label];, вы можете их увидеть.

+0

Краткий ответ, это была проблема :) – Sanandrea

0

У меня были проблемы с установкой изображения на UIImageView в прошлом, и мое решение было изменение порядка к этому:

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

Сначала добавив, что он подвид и затем установить изображение.

+0

Спасибо, но проблема в том, что в границах фрейма есть ошибка, см. Комментарий Larme в моем вопросе. – Sanandrea

Смежные вопросы