自学iOS开发系列----UI(视图编程入门:UIButton)

本篇内容,教学目标:
教学目标

点击按钮可以触发点击事件,来实现一些操作,比如界面跳转,刷新数据等。好比在淘宝上买了衣服,加入购物车,付款的时候,需要点击点击确认支付来触发支付事件,完成支付。

新建项目导入两种图片,并分别名为:background_image.png和background_highlighted_image.png

backgroud_image

background_highlighted_image

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self createButton];

    [self addImageForButton];

    [self addTargetBtn];
}

//创建按钮
- (void)createButton {
    UIButton * button1 = [UIButton buttonWithType:UIButtonTypeCustom];
    //1.设置显示位置
    button1.frame = CGRectMake(150, 30, 100, 20);
    //2.默认为白色,设置为绿色
    button1.backgroundColor = [UIColor greenColor];
    /**
     *  3.为按钮添加标题
     *  UIControlStateNormal 常态 就是不做任何点击操作的时候的状态
     *  UIControlStateHighlighted 高亮 长按按钮不抬起的时候的状态
     *  UIControlStateSelected 被选择 一直处于按下的状态
     */
    [button1 setTitle:@"点我" forState:UIControlStateNormal];
    //4.点击改变按钮文字颜色
    [button1 setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
    [self.view addSubview:button1];
}

//两种为按钮添加背景图的方式
- (void)addImageForButton {
    /**
     *  如果图片的大小大于按钮的大小 图片就会压缩(不是等比例压缩 是按照按钮的宽高进行拉伸)
     *  如果图片的大小小于按钮的大小图片就会按照按钮的大小(宽高)进行扩展
     */
    UIButton * button2 = [UIButton buttonWithType:UIButtonTypeCustom];
    button2.frame = CGRectMake(100, 70, 200, 50);
    [button2 setTitle:@"button2" forState:UIControlStateNormal];
    /**
     *  使用图片类UIImage,为按钮添加背景图片
     *  图片的名称必须带有后缀 --- png图片的后缀是可以省略的,但是jpg等其他类型的图片后缀不可省略,否则添加的图片不成功
     */
    UIImage * image = [UIImage imageNamed:@"background_image"];
    [button2 setBackgroundImage:image forState:UIControlStateNormal];
    [self.view addSubview:button2];



    /**
     *  获取的图片大小后,按获取的尺寸为按钮添加背景图,能确保添加的图片不失真 所以经常使用该方法定义图片按钮。
     */
    UIImage * image2 = [UIImage imageNamed:@"background_image"];
    //先获取这张图有多大
    CGSize size_image = image2.size;
    UIButton * button3 = [UIButton buttonWithType:UIButtonTypeCustom];
    button3.frame = CGRectMake(50, 130, size_image.width, size_image.height);
    [button3 setTitle:@"图片尺寸" forState:UIControlStateNormal];
    [button3 setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    button3.titleLabel.textAlignment = NSTextAlignmentCenter;
    [button3 setBackgroundImage:image2 forState:UIControlStateNormal];
    [button3 setImage:[UIImage imageNamed:@"background_highlighted_image"] forState:UIControlStateHighlighted];
    [self.view addSubview:button3];
}

//触发按钮点击事件
- (void)addTargetBtn {
    UIButton * button4 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button4 setImage:[UIImage imageNamed:@"background_image"] forState:UIControlStateNormal];
    button4.frame = CGRectMake(100, 310, 200, 30);
    /**
     *  第一个参数:添加的是对象指针,action后面的方法在哪个类中实现 此处就添加哪个类的对象指针(一般情况下 此处添加的都是self)
     *  第二个参数:按钮的触发事件,方法的名称
     *  第三个参数:触发方法的事件,添加的是以什么形式触发按钮从而调用action后面的方法(最常用到的方法   UIControlEventTouchUpInside)
     */
    [button4 addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    /**
     *  设置控件的唯一标识
     *  tag:所有的控件都具有的属性,所有的控件的tag值,系统默认都为0
     */
    button4.tag = 101;
    [self.view addSubview:button4];


    UIButton * button5 = [UIButton buttonWithType:UIButtonTypeCustom];
    button5.frame = CGRectMake(100, 360, 200, 30);
    [button5 setImage:[UIImage imageNamed:@"background_image"] forState:UIControlStateNormal];
    [button5 addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    [button5 addTarget:self action:@selector(buttonClickWithDown:) forControlEvents:UIControlEventTouchDown];
    button5.tag = 102;
    [self.view addSubview:button5];
}

- (void)buttonClick:(UIButton *)button {
    if (button.tag == 101) {
        self.view.backgroundColor = [UIColor redColor];
    } else if (button.tag == 102) {
        self.view.backgroundColor = [UIColor greenColor];
    }
}

- (void)buttonClickWithDown:(UIButton *)button {
    self.view.backgroundColor = [UIColor purpleColor];
}

@end

github地址:demo地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个手势解锁的Demo,你可以参考一下: ``` import UIKit class GestureLockViewController: UIViewController { // MARK: - Properties var buttons = [UIButton]() var selectedButtons = [UIButton]() var lines = [CAShapeLayer]() var touchPoint: CGPoint? var isTouching = false // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white let margin: CGFloat = 40 let distance: CGFloat = 80 let buttonWidth: CGFloat = 60 let buttonHeight: CGFloat = 60 let viewWidth = view.bounds.width let viewHeight = view.bounds.height for i in 0..<9 { let row = CGFloat(i / 3) let col = CGFloat(i % 3) let x = margin + col * (buttonWidth + distance) let y = margin + row * (buttonHeight + distance) let button = UIButton(frame: CGRect(x: x, y: y, width: buttonWidth, height: buttonHeight)) button.layer.cornerRadius = buttonWidth / 2 button.layer.borderWidth = 2 button.layer.borderColor = UIColor.lightGray.cgColor button.tag = i view.addSubview(button) buttons.append(button) } } // MARK: - Gesture Methods override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } let point = touch.location(in: view) for button in buttons { if button.frame.contains(point) && !selectedButtons.contains(button) { touchPoint = button.center selectedButtons.append(button) isTouching = true break } } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { guard isTouching, let touch = touches.first else { return } let point = touch.location(in: view) touchPoint = point for button in buttons { if button.frame.contains(point) && !selectedButtons.contains(button) { button.isSelected = true selectedButtons.append(button) let line = CAShapeLayer() line.strokeColor = UIColor.gray.cgColor line.fillColor = UIColor.clear.cgColor line.lineWidth = 3 view.layer.addSublayer(line) lines.append(line) break } } drawLines() } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { isTouching = false touchPoint = nil for button in buttons { button.isSelected = false } validatePassword() clearSelectedButtons() clearLines() } override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { isTouching = false touchPoint = nil for button in buttons { button.isSelected = false } clearSelectedButtons() clearLines() } // MARK: - Private Methods private func drawLines() { guard let point = touchPoint else { return } let linePath = UIBezierPath() linePath.move(to: point) for button in selectedButtons { linePath.addLine(to: button.center) } if let lastButton = selectedButtons.last, isTouching { linePath.addLine(to: lastButton.convert(lastButton.center, to: view)) } lines.last?.path = linePath.cgPath } private func clearSelectedButtons() { for button in selectedButtons { button.isSelected = false } selectedButtons.removeAll() } private func clearLines() { for line in lines { line.removeFromSuperlayer() } lines.removeAll() } private func validatePassword() { let password = selectedButtons.map { "\($0.tag)" }.joined() print("Gesture password: \(password)") } } ``` 这个Demo实现了一个3x3的手势解锁界面,使用了`UIButton`和`CAShapeLayer`来实现。当用户滑动手指时,会根据手指位置,自动连接之前选中的按钮,形成一条线。当用户抬起手指时,会根据选中的按钮的顺序,输出一个密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值