UIButton + XIB subviews = без выделения - PullRequest
2 голосов
/ 21 октября 2011

У меня есть UIButton, и эта кнопка загружает подпредставление из xib. Все хорошо отрисовано, и метод делегата вызывается правильно, но эффект подсветки отсутствует.

У меня все на xib установлено как userInteractionEnabled = false. Если я удалю эти подпредставления, эффект подсветки снова будет работать.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

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

UIButton *button;

UIGraphicsBeginImageContext(viewFromXib.frame.size);
[viewFromXib.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[button setImage:image forState:UIControlStateNormal];
1 голос
/ 02 июля 2012

Если все ваши подпредставления оказываются изображениями, есть сумасшедшее решение: создать несколько UIB-кнопок в качестве подпредставлений и связать их состояния выделения / отключения вместе. Добавьте их все как подпредставления главной кнопки, отключите взаимодействие с пользователем и используйте наблюдателя K-V на главной кнопке. Вот быстрый пример:

// Only perform the addObserver part if from a XIB
- (UIButton *) makeMasterButton { 
    // Create some buttons
    UIButton *masterButton = [UIButton buttonWithType:UIButtonTypeCustom];
    masterButtonFrame = CGRectMake(0,0,100,100);

    UIButton *slaveButton1 = [UIButton buttonWithType:UIButtonTypeCustom];
    slaveButton1.userInteractionEnabled = NO;
    [slaveButton1 setImage:[UIImage imageNamed:@"Top.png"]];
    slaveButton1.frame = CGRectMake(0, 0,100,50);
    [masterButton addSubview:slaveButton1];

    UIButton *slaveButton2 = [UIButton buttonWithType:UIButtonTypeCustom];
    slaveButton2.userInteractionEnabled = NO;
    [slaveButton2 setImage:[UIImage imageNamed:@"Bottom.png"]];
    slaveButton2.frame = CGRectMake(0,50,100,50);
    [masterButton addSubview:slaveButton2];

    // Secret sauce: add a K-V observer
    [masterButton addObserver:self forKeyPath:@"highlighted" options:(NSKeyValueObservingOptionNew) context:NULL];
    [masterButton addObserver:self forKeyPath:@"enabled" options:(NSKeyValueObservingOptionNew) context:NULL];
    return masterButton;
}

 ...

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([object isKindOfClass:[UIButton class]]) {
        UIButton *button = (UIButton *)object;
        for (id subview in button.subviews) {
            if ([subview isKindOfClass:[UIButton class]]) {
                UIButton *buttonSubview = (UIButton *) subview;
                buttonSubview.highlighted = button.highlighted;
                buttonSubview.enabled = button.enabled;
            }
        }
    }
}    

Мне пришлось сделать это один раз, когда я хотел получить «изображение» для кнопки UIB, которая имела бы слои, прозрачность и динамически загружаемый контент.

...