2011-10-21 3 views
2

私はUIButtonを持っていて、このボタンはxibからサブビューをロードします。 すべてが細かく描画され、デリゲートメソッドが正しく呼び出されますが、ハイライト効果はありません。UIButton + XIBサブビュー=いいえハイライト

私はxibのすべてをuserInteractionEnabled = falseに設定しました。 これらのサブビューを削除すると、ハイライトエフェクトが再び機能します。

ご協力いただければ幸いです。

答えて

2

xibからロードしたビューをUIImageに変換して、代わりにそのイメージをUIButtonに追加することができます。ボタンが押されたときにハイライトが表示されます。この方法:

UIButton *button; 

UIGraphicsBeginImageContext(viewFromXib.frame.size); 
[viewFromXib.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
[button setImage:image forState:UIControlStateNormal]; 
1

すべてのサブビューをイメージすることが起こる場合は、狂気の解決策があります:サブビューとして、複数のUIButtonsを作成して、一緒に彼らのハイライト/無効の状態を結びます。それらをすべてマスターボタンのサブビューとして追加し、ユーザー対話を無効にして、マスターボタンで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; 
      } 
     } 
    } 
}  

私はレイヤーを持っていたUIButtonための「画像」、透明性と動的にロードされたコンテンツを持っていると思ったとき、私は一度これをしなければなりませんでした。

関連する問題