如何禁用自定义UIButton

时间:2014-03-12 06:07:54

标签: ios uibutton

我将UIButton子类化,并使用drawRect方法进行了一些自定义绘制,例如绘制NSAttributedStringUIImage

但是,在我执行此操作后,当UIButton设置为enabled时,自定义的NO不会灰显。我认为我的定制绘图发生在其状态之上。我该如何处理?

在此处分享我的绘图代码:

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    if (self.faceUp) {
        [self drawCardText:self.card.contents inRect:self.bounds];
    } else {
        [self drawCardImage:[UIImage imageNamed:CardBackImageName] inRect:self.bounds];
    }
}

- (void)drawCardText:(NSString *)text inRect:(CGRect)rect
{
    // set background color to white so text can be shown
    [[UIColor whiteColor] setFill];
    [[UIBezierPath bezierPathWithRect:rect] fill];

    UIFont *preferedFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
    UIFont *actualFont = [UIFont fontWithName:preferedFont.fontName
                                     size:hypotf(rect.size.width, rect.size.height) / 6.0];

    NSDictionary *attributes = @{NSFontAttributeName: actualFont};

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes];
    [self setAttributedTitle:attributedText forState:UIControlStateNormal];
}

- (void)drawCardImage:(UIImage *)image inRect:(CGRect)rect
{
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 1.0f);
    [image drawInRect:rect];
    UIImage *actualImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [[UIColor colorWithPatternImage:actualImage] setFill];
    [[UIBezierPath bezierPathWithRect:rect] fill];
}

6 个答案:

答案 0 :(得分:1)

您可能需要自己添加灰色和某些Alpha的叠加视图。再次启用按钮时删除叠加层。

答案 1 :(得分:1)

您可以将此方法添加到CustomButton类。

-(void)setEnabled:(BOOL)enabled{

    //disableLayer.hidden = !enabled;
    if (enabled) {
        //self.enabled = YES;
        self.alpha = 1.0;
    }else{
        //self.enabled = NO;
        self.alpha = 0.7;
    }
    [super setEnabled:enabled];
}

启用或禁用通话 -

[customButtob setEnabled:buttonStatus];

如果要更改颜色,请添加背景图层,并在setEnabled方法中切换其隐藏属性。

disableLayer = [CALayer layer];
disableLayer.backgroundColor = [UIColor colorWithRed:20/255.0f green:20/255.0f blue:20/255.0f alpha:1.0f].CGColor;
disableLayer.frame = self.layer.bounds;
disableLayer.hidden = YES;
[self.layer insertSublayer:disableLayer below:otherLayer];  

答案 2 :(得分:0)

您可以使用

 btn.userInteractionEnabled = NO; 

或者您可以使用

btn.enabled = NO;

希望这有助于......:)

修改

我认为你可以使用这个

[btn setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];

添加:

-(void)setEnabled:(BOOL)enabled{

if (!enabled) {
    self.alpha = 0.3;
}else{
    self.alpha = 1.0;
}
[super setEnabled:enabled];

}

答案 3 :(得分:0)

我想您会分享一些有关实施的详细信息。而且我相信你已经打电话了

Super methods in the customized methods at first call.

答案 4 :(得分:0)

您必须覆盖setEnabled:

CustomButton方法
-(void)setEnabled:(BOOL)enabled
{
    if (!enabled) {
        [self setAlpha:0.2f];
    }
}

如果必须更改处于禁用状态的UIButton的颜色。哟可以将drawRect:方法更改为

制作assign类型变量BOOL属性(例如 isEnabled

-(void)drawRect:(CGRect)rect
{
    [[UIColor redColor] setFill];
    UIRectFill(rect);

    if (!self.isEnabled) {
        [[UIColor blackColor] setFill];
        UIRectFill(rect);
    }
}

-(void)setEnabled:(BOOL)enabled
{
    self.isEnabled = enabled;
    [self setNeedsDisplay];
}

答案 5 :(得分:0)

添加一个方法,可以帮助你启用和禁用你的按钮只需在自定义按钮类

中添加此方法
 //in customButton.h file
 #import <UIKit/UIKit.h>  


 @interface CustomButton : UIButton
 @property (nonatomic,assign) BOOL faceUp;//your property
 - (void)makeButtonDisable:(BOOL)disable;//method to handle disable and enable
 @end


 //in customButton.m file

 #import "CustomButton.h"
@implementation CustomButton
{
  CALayer *grayLayer;//layer to handle disable and enable
}
@synthesize faceUp;

  //  in initilization method
  - (id)initWithFrame:(CGRect)frame
   {
     self = [super initWithFrame:frame];
     if(self)
     {
      grayLayer = [CALayer layer];
      grayLayer.frame = frame;
      [self.layer addSublayer:grayLayer]; //add the grayLayer during initialisation 
     }
     return self;
   }



//your code that put above
- (void)drawRect:(CGRect)rect
 {
  // Drawing code
  if (self.faceUp) {
    [self drawCardText:self.card.contents inRect:self.bounds];
    } else {
    [self drawCardImage:[UIImage imageNamed:CardBackImageName] inRect:self.bounds];
   }
 }

 - (void)drawCardText:(NSString *)text inRect:(CGRect)rect
{
   // set background color to white so text can be shown
   [[UIColor whiteColor] setFill];
   [[UIBezierPath bezierPathWithRect:rect] fill];

   UIFont *preferedFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
   UIFont *actualFont = [UIFont fontWithName:preferedFont.fontName
                                 size:hypotf(rect.size.width, rect.size.height) / 6.0];

   NSDictionary *attributes = @{NSFontAttributeName: actualFont};

   NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes];
   [self setAttributedTitle:attributedText forState:UIControlStateNormal];
 }

 - (void)drawCardImage:(UIImage *)image inRect:(CGRect)rect
 {
   UIGraphicsBeginImageContextWithOptions(rect.size, NO, 1.0f);
   [image drawInRect:rect];
   UIImage *actualImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   [[UIColor colorWithPatternImage:actualImage] setFill];
   [[UIBezierPath bezierPathWithRect:rect] fill];
 }

 //add this method 
 - (void)makeButtonDisable:(BOOL)disable
 {
    if(disable)
    {
     grayLayer.backgroundColor = [UIColor colorWithRed:201.0f/255.0f green:201.0f/255.0f blue:201.0f/255.0f alpha:5.0f].CGColor;
    self.userInteractionEnabled = NO;
    grayLayer.opacity = 0.5f;
    self.alpha = 0.5f;
   }
   else
   {
    grayLayer.backgroundColor = [UIColor clearColor].CGColor;
    self.userInteractionEnabled = YES;
    grayLayer.opacity = 0.0f;
    self.alpha = 1.0f;
   }

}
在您使用此按钮的控制器中

   //some where in the controller u want to disable the button just do like this

  //to disable
  [button makeButtonDisable:YES]; //button is an instance of customCell

 //to enable
  [button makeButtonDisable:NO]; //button is an instance of customCell