美文网首页我爱编程
Objective-C:按钮(UIButton)

Objective-C:按钮(UIButton)

作者: 西蜀 | 来源:发表于2018-04-25 10:58 被阅读526次

    一、UIButton的定义

    两种创建方法        

    1)常规的initWithFrame的方式

    UIButton *btn1 = [[UIButton alloc]initWithFrame:CGRectMake(100, 50, 100, 75)];

    [btn1 setTitle:@"close" forState:UIControlStateNormal];

    btn1.backgroundColor = [UIColor greenColor];//button的背景颜色

    [btn1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];//button的背景图片

    2)UIButton 的一个类方法(也可以说是静态方法)buttonWithType 

    UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];//创建一个圆角矩形的按钮btn2.frame = CGRectMake(200, 20, 50, 60);

    btn2.backgroundColor = [UIColor blackColor];

    [btn2 setTitle:@"clicke" forState:UIControlStateNormal];

    [self.window addSubview:btn1];

    [self.window addSubview:btn2];

    创建一个自定义的按钮

    UIButton *button1=[UIButton buttonWithType:UIButtonTypeCustom];

    能够定义的button类型有以下6种

    typedef enum {

          UIButtonTypeCustom = 0,          自定义风格-无类型,按钮的内容需要自定义:位置尺寸、背景色,等(如果没有自定义这些可能会看不到

          UIButtonTypeRoundedRect,        圆角矩形

          UIButtonTypeDetailDisclosure,    蓝色小箭头按钮,主要做详细说明用

          UIButtonTypeInfoLight,          亮色感叹号

          UIButtonTypeInfoDark,            暗色感叹号

          UIButtonTypeContactAdd,          十字加号按钮

        } UIButtonType;

    👩🏻‍🎓注意:按钮创建好之后,按钮的类型是不可以被修改的

    知识点:Detail Disclosure/info Light/info Dark长一样(iOS7以前不一样,扁平化以后都一样,残留的东西)

    二、设置frame

        //给定button在view上的位置 

         button1.frame = CGRectMake(20, 20, 280, 20);

        [button setFrame:CGRectMake(20,20,50,50)];

    ✨✨✨✨调整Button内部布局✨✨✨✨

    1,调整内部子控件布局应用场景

    -按钮文字在图片下方

    -按钮文字在图片上方

    -按钮文字在图片左边(默认是在右边)

    -等等; 根据需求调整布局内部子控件

    2,实现步骤

    -自定义按钮->创建一个继承 UIButton 的子类(如:CDHButton)

    -给自定义按钮中的子控件重新布局(有两种方法)

    -方法一:要实现两个对象方法

    -(CGRect)titleRectForContentRect:(CGRect)contentRect{

        // 返回文字的frame 

    }

    -  (CGRect)imageRectForContentRect:(CGRect)contentRect{

        // 返回图片的frame

    }

    -方法二:实现layoutSubViews方法

    - (void)layoutSubviews{

        [super layoutSubviews];

        // 插入需要设置位置尺寸的语句,并返回frame

    }

    3,设置是否调整图片的显示亮度

    设置属性

    // 设置在 Highlighted 状态点击时是否调整图片显示亮度

    @property(nonatomic)          BOOL        adjustsImageWhenHighlighted;    // default is YES. if YES, image is drawn darker when highlighted(pressed)

    // 设置在disabled状态是否调整图片显示亮度

    @property(nonatomic)          BOOL        adjustsImageWhenDisabled;      // default is YES. if YES, image is drawn lighter when disabled

    /*  在disabled要不要调整显示的图片,当disabled的时候也不改变背景色  */

    self.adjustsImageWhenDisabled = NO;

    4,按钮的内边距

    设置内边距属性

    // 按钮内的子控件(图片和文字)的内边距,

    @property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR; // default is UIEdgeInsetsZero

    // 按钮内的子控件(文字)的内边距,

    @property(nonatomic) UIEdgeInsets titleEdgeInsets; // default is UIEdgeInsetsZero

    // 按钮内的子控件(图片)的内边距,

    @property(nonatomic) UIEdgeInsets imageEdgeInsets; // default is UIEdgeInsetsZero

    例子:

    // 设置按钮内图片和文字内边距位置为(30,30),即是按钮内图片和文字一起右移30,下移30

    self.btn.contentEdgeInsets = UIEdgeInsetsMake(30, 30, 0, 0);

    // 设置按钮内文字内边距位置为(0,-30),即是按钮内文字上移30

    self.btn.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);

    // 设置按钮内图片内边距位置为(0,-30),即是按钮内图片上移30

    self.btn.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);

    三、button背景色

        //button背景色

         button1.backgroundColor = [UIColor clearColor];

          [button setBackgroundColor:[UIColor blueColor]];

    四、设置button填充图片和背景图片

    //设置button填充图片和背景图片

        [button1 setImage:[UIImage imageNamed:@"btng.png"] forState:UIControlStateNormal];

        [button setBackgroundImage:[UIImageimageNamed:@"btng.png"]forState:UIControlStateNormal];

    五、设置button标题和标题颜色

    //设置button标题和标题颜色

        [button1 setTitle:@"点击" forState:UIControlStateNormal];

        [button setTitleColor:[UIColorredColor]forState:UIControlStateNormal];

        [button setTitleShadowColor:[UIColor grayColor] forState:UIControlStateNormal ]; //阴影

    六、state状态

    forState: 这个参数的作用是定义按钮的文字或图片在何种状态下才会显现

    以下是几种状态

    enum {

            UIControlStateNormal      = 0,        常规状态显现           

            UIControlStateHighlighted  = 1 << 0,    高亮状态显现 

            UIControlStateDisabled    = 1 << 1,    禁用的状态才会显现

            UIControlStateSelected    = 1 << 2,    选中状态           

            UIControlStateApplication  = 0x00FF0000, 当应用程序标志时         

            UIControlStateReserved    = 0xFF000000  为内部框架预留,可以不管他           

        };

    @property(nonatomic,getter=isEnabled)BOOL enabled; // default is YES. if NO, ignores touch events and subclasses may draw differently 

     @property(nonatomic,getter=isSelected)BOOL selected; // default is NO may be used by some subclasses or by application 

     @property(nonatomic,getter=isHighlighted)BOOL highlighted;

    1. normal(普通状态)

    -默认情况(Default)

    -对应的枚举常量:UIControlStateNormal

    -除开UIControlStateHighlighted、UIControlStateDisabled、UIControlStateSelected以外的其他情况,都是normal状态

    -这种状态下的按钮【可以】接收点击事件

    -如果前后连着设置按钮同时处于多种状态, 则表现出来的也是 normal 状态, 除去如果有 设置为 enabled = NO; 则会进入UIControlStateDisabled状态(包括颜色), 不能点击

    //下面两种杂交在一起(就不是 normal 后面三种 ), 会显示为 Normal 状态的颜色,

    //但是 设置了 Enabled == NO, 所以这里也是不能点击的,

    self.button.selected = YES;

    self.button.enabled = NO;

    2. highlighted(高亮状态)

    -对应的枚举常量:UIControlStateHighlighted

    -【当按住按钮不松开】或者【highlighted = YES】时就能达到这种状态

    -这种状态下的按钮【可以】接收点击事件

    3.selected (选中状态)

    -对应的枚举常量: UIControlStateSelected

    -【button.selected = YES】时就能达到这种状态

    -这种状态下的按钮【可以】接收点击事件

    4. disabled(失效状态,不可用状态)

    -如果enabled属性为NO,就是处于disable状态,代表按钮不可以被点击

    -对应的枚举常量:UIControlStateDisabled

    -【button.enabled = NO】时就能达到这种状态

    -这种状态下的按钮【无法】接收点击事件

    5. 让按钮无法点击的2种方法

    -button.enabled = NO; 

    【会】进入UIControlStateDisabled状态

    -button.userInteractionEnabled = NO; 

    【不会】进入UIControlStateDisabled状态,继续保持当前状态

    重写按钮的某个状态属性的 setter 方法和 getter 方法设置按钮的状态

    -如: 重写按钮高亮get方法, 如果返回值是 yes , 则永远返回的是高亮状态, 如果返回值是 NO 则永远返回的是非高亮

    - (BOOL)isHighlighted{

      return NO;

    }

    -重写按钮高亮 set 方法, 如果没有实现内部属性赋值(属性是父类定义的, 要调用父类的方法赋值), 则不会出现高亮状态

     //   如果给内部属性赋值为 Yes , 则会一直为 YES状态, 如果赋值为 NO, 则一直未 NO 状态

    - (void)setHighlighted:(BOOL)highlighted{

      [super setHighlighted:highlighted];

    }

    七、设置按钮按下是否颜色变深

    /*

        * 默认情况下,当按钮高亮的情况下,图像的颜色会被画深一点,如果这下面的这个属性设置为no,那么可以去掉这个功能

        */    

    button1.adjustsImageWhenHighlighted = NO;

    /* 跟上面的情况一样,默认情况下,当按钮禁用的时候,图像会被画得深一点,设置NO可以取消设置 */ 

     button1.adjustsImageWhenDisabled = NO;

    八、设置按钮按下会发光

    /* 下面的这个属性设置为yes的状态下,按钮按下会发光 */ 

     button1.showsTouchWhenHighlighted = YES;

    九、添加或删除事件处理

    /* 给button添加事件,事件有很多种

        按下按钮,并且手指离开屏幕的时候触发这个事件,跟web中的click事件一样。

        触发了这个事件以后,执行butClick:这个方法,addTarget:self 的意思是说,这个方法在本类中也可以传入其他类的指针  */    

    //添加事件    

    [button1 addTarget:self action:@selector(butClick:) forControlEvents:UIControlEventTouchUpInside];

     //删除事件   

     [button1 removeTarget:nil action:nil forControlEvents:UIControlEventTouchUpInside];

     //显示控件   

     [self.view addSubview:button1];

    十、设置按钮内部图片间距和标题间距

    UIEdgeInsets insets; // 设置按钮内部图片间距

    insets.top = insets.bottom = insets.right = insets.left = 10;

    bt.contentEdgeInsets = insets;

    bt.titleEdgeInsets = insets; // 标题间距

    十一、一些其他的按钮设置

    btn1.titleLabel.font = [UIFont fontWithName:@“test” size:18];//设置按钮字体大小

    [btn1 setTag:101] ;//设置tag值

    btn1.layer.cornerRadius = 4.5;//设置圆角——四个圆角半径

    btn1.layer.borderWidth = 0.5;// 按钮边框宽度

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // 设置颜色空间为rgb,用于生成

    ColorRefCGColorRef borderColorRef = CGColorCreate(colorSpace,(CGFloat[]){ 0, 0, 0, 1 }); // 新建一个红色的ColorRef,用于设置边框(四个数字分别是 r, g, b, alpha)btn1.layer.borderColor = borderColorRef;

    十二、重写绘制行为

    你可以通过子类化按钮来定制属于你自己的按钮类。在子类化的时候你可以重载下面这些方法,这些方法返回CGRect结构,指明了按钮每一组成部分的边界。

          👩🏻‍🎓 注意:不要直接调用这些方法, 这些方法是你写给系统调用的。

    backgroundRectForBounds //指定背景边界 

    contentRectForBounds // 指定内容边界 

    titleRectForContentRect // 指定文字标题边界 

     imageRectForContentRect //指定按钮图像边界

            例:

    - (CGRect)imageRectForContentRect:(CGRect)bounds{

        return CGRectMake(0.0, 0.0, 44, 44);

    }

    [btn1 addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];//添加点击按钮事件

    -(void)btnPressed:(id)sender{ 

          UIButton* btn = (UIButton*)sender; 

          //开始写你自己的动作 

    }

    forControlEvents参数类型

    typedef NS_OPTIONS(NSUInteger, UIControlEvents)

    {

        UIControlEventTouchDown                = 1 <<  0,      // 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。    

        UIControlEventTouchDownRepeat      = 1 <<  1,      // 多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。    

        UIControlEventTouchDragInside        = 1 <<  2,      // 当一次触摸在控件窗口内拖动时。    

        UIControlEventTouchDragOutside      = 1 <<  3,      // 当一次触摸在控件窗口之外拖动时。    

        UIControlEventTouchDragEnter          = 1 <<  4,      // 当一次触摸从控件窗口之外拖动到内部时    

        UIControlEventTouchDragExit            = 1 <<  5,      // 当一次触摸从控件窗口内部拖动到外部时。    

        UIControlEventTouchUpInside            = 1 <<  6,      // 所有在控件之内触摸抬起事件    

        UIControlEventTouchUpOutside          = 1 <<  7,      // 所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。    

        UIControlEventTouchCancel                = 1 <<  8,      //所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。   

         UIControlEventValueChanged            = 1 << 12,    // 当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。    

        UIControlEventEditingDidBegin          = 1 << 16,    // 当文本控件中开始编辑时发送通知    

        UIControlEventEditingChanged          = 1 << 17,    // 当文本控件中的文本被改变时发送通知。    

        UIControlEventEditingDidEnd              = 1 << 18,    // 当文本控件中编辑结束时发送通知。    

        UIControlEventEditingDidEndOnExit    = 1 << 19,    // 当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。    

        UIControlEventAllTouchEvents            = 0x00000FFF,  // 通知所有触摸事件。    

        UIControlEventAllEditingEvents          = 0x000F0000,  // 通知所有关于文本编辑的事件。    

        UIControlEventApplicationReserved    = 0x0F000000,  // range available for application use    

        UIControlEventSystemReserved          = 0xF0000000,  // range reserved for internal framework use    

        UIControlEventAllEvents                      = 0xFFFFFFFF  // 通知所有事件

    };

    UIButton的常见属性设置方法

    - (void)setTitle:(NSString *)title forState:(UIControlState)state;//设置按钮的文字

    - (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;//设置按钮的文字颜色

    - (void)setImage:(UIImage *)image forState:(UIControlState)state; //设置按钮内部的小图片

    - (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state;//设置按钮的背景图片

    btn.titleLabel.font = [UIFont systemFontOfSize:13];//设置按钮的文字字体(需要拿到按钮内部的label来设置)

    - (NSString *)titleForState:(UIControlState)state; //获得按钮的文字

    - (UIColor *)titleColorForState:(UIControlState)state;//获得按钮的文字颜色

    - (UIImage *)imageForState:(UIControlState)state;//获得按钮内部的小图片

    - (UIImage *)backgroundImageForState:(UIControlState)state;//获得按钮的背景图片

    Objective-C:按钮(UIButton)

    相关文章

      网友评论

        本文标题:Objective-C:按钮(UIButton)

        本文链接:https://www.haomeiwen.com/subject/gemelftx.html