2010-05-18 16 views
24

UIControl için var olan UIControlState değerlerinden biri değil, özel durumlar ayarlama yolu var mı?Kendi kontrolüm için UIControlState özel değerlerini kullanabilir miyim?

UIControlSate enum'da, özel kontrol durumları için kullanılabilecek 16 bit vardır:

UIControlStateApplication = 0x00FF0000,    // additional flags available for application use 

Sorun, UIControl'in state özelliğinin readonly olmasıdır.

Özel durumlar için UIButton cihazıma farklı arka plan resimleri koymak istiyorum.

cevap

34

Sen UIControl bir alt sınıfta özel durumlarının yararlanabilir.

  • Özel durumlarınızı yönetebileceğiniz customState adlı bir değişken oluşturun.
  • Eğer bir devlet ayarlamak bu değişkenin karşı bayrak operasyonları yapmak ve [self stateWasUpdated] aramak gerekir.
  • onlar [self stateWasUpdated] diyoruz böylece customState
  • Geçersiz Kıl karşı enabled, selected ve highlighted belirleyiciler [super state] bitsel OR operatörüyle dönmek için state özelliğini geçersiz kılar
  • . uygulamada

    #define kUIControlStateCustomState (1 << 16) 
    
    @interface MyControl : UIControl { 
        UIControlState customState; 
    } 
    

    : Bu durumda herhangi bir değişiklik cevap sağlayacak, sadece başlığında devlet

değişikliklere cevap mantığıyla stateWasUpdated Uygulamak customState

  • değişir :

    @implementation MyControl 
    
    -(void)setCustomState { 
        customState |= kUIControlStateCustomState; 
        [self stateWasUpdated]; 
    } 
    
    -(void)unsetCustomState { 
        customState &= ~kUIControlStateCustomState; 
        [self stateWasUpdated]; 
    } 
    
    - (UIControlState)state { 
        return [super state] | customState; 
    } 
    
    - (void)setSelected:(BOOL)newSelected { 
        [super setSelected:newSelected]; 
        [self stateWasUpdated]; 
    } 
    
    - (void)setHighlighted:(BOOL)newHighlighted { 
        [super setHighlighted:newHighlighted]; 
        [self stateWasUpdated]; 
    } 
    
    - (void)setEnabled:(BOOL)newEnabled { 
        [super setEnabled:newEnabled]; 
        [self stateWasUpdated]; 
    } 
    
    - (void)stateWasUpdated { 
        // Add your custom code here to respond to the change in state 
    } 
    
    @end 
    
  • +4

    UIControlState enum uygulaması kontrolü devletler maskesi 0x00FF0000 kullandığını belirtir. Bu 1 << 16 ila 1 << 23 anlamına gelir. 1 << 3 kullanıyorsunuz bu geçerli mi? Apple'ın ekleyebileceği gelecekteki kontrol durumlarıyla çatışabilir mi? –

    +2

    Ayrıca not edilmelidir; Başlık, arka plan resmi, resim, titleShadow veya attributedTitle gibi UIButton'daki özel kaynakları denetlemek için özel durumlar kullanmayı planlıyorsanız. Özel durumunuzu değiştirdikten sonra setNeedsLayout öğesini çağırmanız gerekir. Aksi halde, düğmeye tekrar basıldıktan sonra sadece görünüm güncellenir. –

    +0

    OS'nin gelecekteki sürümlerinde çakışacak olan Adamlar gibi kesinlikle 1 << 3'ü kullanmayın. 0x00FF0000 bit maskesi aralığında bir sayı kullanın. – christophercotton

    5

    @Nick yanıtı temel alınmıştır Daha basit bir sürümünü uyguladım. Bu alt sınıf selected, highlighted ve enabled benzer işlev olan bir BOOL outlined özellik sunar.

    [customButtton setImage:[UIImage imageNamed:@"MyOutlinedButton.png"] forState:UIControlStateOutlined] gibi şeyler yapmak, outlined özelliğini güncelleştirdiğinizde otomatik olarak çalışmasını sağlar. Gerekirse bu devlet + mülkiyet ait

    Daha eklenebilir.


    UICustomButton.h

    extern const UIControlState UIControlStateOutlined; 
    
    @interface UICustomButton : UIButton 
    @property (nonatomic) BOOL outlined; 
    @end 
    

    UICustomButton.m Nick'in cevabın

    const UIControlState UIControlStateOutlined = (1 << 16); 
    
    @interface OEButton() 
    @property UIControlState customState; 
    @end 
    
    @implementation OEButton 
    
    - (void)setOutlined:(BOOL)outlined 
    { 
        if (outlined) 
        { 
         self.customState |= UIControlStateOutlined; 
        } 
        else 
        { 
         self.customState &= ~UIControlStateOutlined; 
        } 
        [self stateWasUpdated]; 
    } 
    
    - (BOOL)outlined 
    { 
        return (self.customState & UIControlStateOutlined) == UIControlStateOutlined; 
    } 
    
    - (UIControlState)state { 
        return [super state] | self.customState; 
    } 
    
    - (void)stateWasUpdated 
    { 
        [self setNeedsLayout]; 
    } 
    
    // These are only needed if you have additional code on -(void)stateWasUpdated 
    // - (void)setSelected:(BOOL)newSelected 
    // { 
    //  [super setSelected:newSelected]; 
    //  [self stateWasUpdated]; 
    // } 
    // 
    // - (void)setHighlighted:(BOOL)newHighlighted 
    // { 
    //  [super setHighlighted:newHighlighted]; 
    //  [self stateWasUpdated]; 
    // } 
    // 
    // - (void)setEnabled:(BOOL)newEnabled 
    // { 
    //  [super setEnabled:newEnabled]; 
    //  [self stateWasUpdated]; 
    // } 
    
    @end 
    
    1

    Swift 3 versiyon:

    extension UIControlState { 
        static let myState = UIControlState(rawValue: 1 << 16) 
    } 
    
    class CustomControl: UIControl { 
    
        private var _customState: UInt = 0 
    
        override var state: UIControlState { 
         return UIControlState(rawValue: super.state.rawValue | self._customState) 
        } 
    
        var isMyCustomState: Bool { 
         get { 
          return self._customState & UIControlState.myState.rawValue == UIControlState.myState.rawValue 
         } set { 
          if newValue == true { 
           self._customState |= UIControlState.myState.rawValue 
          } else { 
           self._customState &= ~UIControlState.myState.rawValue 
          } 
         } 
        } 
    }