2010-05-18 2 views
24

UIControl에 대해 기존 UIControlState 값 중 하나가 아닌 사용자 정의 상태를 설정하는 방법이 있습니까?나만의 컨트롤을 위해 UIControlState의 사용자 지정 값을 사용할 수 있습니까?

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

문제는 UIControlstate 재산권 읽기 전용 있다는 다음에 열거 UIControlSate

은 사용자 제어 상태에 대해 사용될 수있는 16 비트가있다.

사용자 정의 상태에 대해 다른 배경 이미지를 UIButton으로 설정하고 싶습니다.

답변

34

UIControl의 하위 클래스에서 사용자 지정 상태를 사용할 수 있습니다.

  • 사용자 지정 상태를 관리 할 customState이라는 변수를 만듭니다.
  • 상태를 설정해야하는 경우이 변수에 대해 플래그 조작을 수행하고 [self stateWasUpdated]으로 전화하십시오.
  • [self stateWasUpdated]를 호출 있도록 customState
  • 오버라이드에 대해 enabled, selectedhighlighted 세터를 [super state] 비트 논리합을 반환 할 state 속성을 재정의
  • . 구현에

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

    :이 상태의 변경에 응답 할 수 있습니다뿐만 아니라 헤더에서 상태

변화에 대응하는 논리 stateWasUpdated을 구현 customState

  • 로 변경 :

    @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 열거 앱 제어 상태가 마스크 0x00FF0000를 사용하도록 지정합니다. 이것은 1 << 16 to 1 << 23을 의미합니다. 1 << 3이 유효합니까? 그것은 아마도 사과가 추가 할 수있는 미래의 통제 상태와 충돌 할 수 있습니까? –

    +2

    또한주의해야합니다. 사용자 정의 상태를 사용하여 UIButton에서 제목, 배경 이미지, 이미지, titleShadow 또는 attributedTitle과 같은 사용자 정의 자원을 제어하려는 경우. 사용자 정의 상태를 변경 한 후에 setNeedsLayout을 호출해야합니다. 그렇지 않으면 버튼을 다시 탭한 후 모양이 업데이트됩니다. –

    +0

    확실히 향후 버전의 OS에서 충돌하는 Adam 상태로 1 << 3을 사용하지 마십시오. 비트 마스크 범위 0x00FF0000의 숫자를 사용하십시오. – christophercotton

    5

    나는 더 간단한 버전을 구현했습니다. 이 하위 클래스는 selected, highlightedenabled과 비슷한 기능을 제공하는 BOOL outlined 속성을 제공합니다.

    [customButtton setImage:[UIImage imageNamed:@"MyOutlinedButton.png"] forState:UIControlStateOutlined]과 같은 것을 사용하면 outlined 속성을 업데이트 할 때 자동으로 작동합니다.

    기타 상태 + 속성을 추가 할 수 있습니다.


    UICustomButton.h

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

    UICustomButton.m 닉의 답변

    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

    스위프트 3 버전 :

    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 
          } 
         } 
        } 
    }