「OC」事件点击demo合集

[OC]-<UI入门>--常用控件-UIButton 文章目录UIButtonUIButton基础创建文字UIButton设置UIButton 的属性不带图片的UIButton 效果带图片的UIButton带图片的Button创建注意事项及代码解读效果UIButton事件处理事件处理的多个参数先明白参数的意义实现事件事件需要调用的函数(参数之一)效果 UIButton UIButton基础 按钮是所有UI体系中非常重要的组件,在iOS中按钮UIButton的使用也非常灵活 创建文字UIButton 对于UI对象 我们在创建的时候注意一些事项,创建UI对象 阅读详情

「OC」事件点击demo合集

前言

在前面通过学习事件响应流程,学习了许多新的内容,当然也学习了许多不同的用法,但在之前的文章之中并没有将运用到事件响应链的demo写在文章当中,所以这篇文章总结了我学习事件点击写的一些小demo

可用鼠标移动的UIview

我们可以重写UIView之中的- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event,实现一个可供鼠标点击移动的UIview

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //获取触摸对象
    UITouch *touch = [touches anyObject];
    //获取前一个触摸点位置
    CGPoint prePoint = [touch previousLocationInView:self];
    //获取当前触摸点位置
    CGPoint curPoint = [touch locationInView:self];
    //计算偏移量
    CGFloat offsetX = curPoint.x - prePoint.x;
    CGFloat offsetY = curPoint.y - prePoint.y;
    //相对之前的位置偏移视图
    self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);
}

Sep-07-2024 12-14-16

突出的tabBar按钮

我们通过重写tabBar的子类可以做出以下内容,但是我们发现点击超出tabBar范围的按钮部分并不会响应

//写tabBar的子类
#import "JCTabBar.h"
@implementation JCTabBar

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setupCenterButton];
    }
    return self;
}

- (UIImage *)rotateImage:(UIImage *)image byDegrees:(CGFloat)degrees {
    CGSize size = image.size;
    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    // 计算旋转角度
    CGContextTranslateCTM(context, size.width / 2, size.height / 2);
    CGContextRotateCTM(context, degrees * M_PI / 180);

    
    [image drawInRect:CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height)];
    UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return rotatedImage;
}

- (void)setupCenterButton {
    self.centerButton = [UIButton buttonWithType:UIButtonTypeCustom];
    self.centerButton.backgroundColor = [UIColor whiteColor];

    [self.centerButton setImage:[UIImage imageNamed:@"jiahao.png"] forState:UIControlStateNormal];
    [self.centerButton setImage:[self rotateImage:[UIImage imageNamed:@"jiahao.png"] byDegrees:45] forState:UIControlStateSelected];
    [self addSubview:self.centerButton];
}

- (void)layoutSubviews {
    [super layoutSubviews];
    
    [self bringSubviewToFront:self.centerButton];
    
    CGFloat width = self.frame.size.width;
    
    self.backgroundColor = [UIColor whiteColor];
    CGFloat centerButtonSize = 60; // 中间按钮的大小
    self.centerButton.frame = CGRectMake((width - centerButtonSize) / 2,
                                         -centerButtonSize / 2,
                                         centerButtonSize ,
                                         centerButtonSize);
    self.centerButton.layer.cornerRadius = (centerButtonSize) / 2;
    self.centerButton.clipsToBounds = YES;
    [self.centerButton addTarget:self action:@selector(centerButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    // 调整其他 TabBar 项的位置
    CGFloat tabBarItemWidth = width / 5;
    NSInteger index = 0;
    for (UIView *subview in self.subviews) {
        if ([subview isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
            if (index == 2) {
                // 跳过中间位置
                index++;
            }
            CGRect frame = subview.frame;
            frame.origin.x = index * tabBarItemWidth;
            subview.frame = frame;
            index++;
        }
    }
}

- (void)centerButtonAction:(UIButton *)sender {
    self.centerButton.selected = !self.centerButton.selected;
    

}

@end

Sep-07-2024 12-10-00

在这个demo之中我们主要是运用了在寻找最佳响应者之中的相关内容,我们先画出以下图片。

img

我们通过分析可以得出视图层次

RootView
└── TableView
└── TabBar
    └── CircleButton

如果我们点击按钮区域后,我们自己料想的应该是,生成的触摸事件首先传到UIWindow,然后传到控制器的根视图即RootView。RootView经判断可以响应触摸事件,而后将事件传给了子控件TabBar。但是问题就出在这里,如果我们点击红色方框的部分触摸点不在TabBar的坐标范围内,因此TabBar无法响应该触摸事件,hitTest:withEvent: 直接返回了nil。

既然如此,问题是出现在hitTest:withEvent: 的判断逻辑之上,我们只要重写TabBar的 pointInside:withEvent: 当我们点击到按钮的范围就返回YES,如果没有点击到按钮的范围之中,那么就按照之前的点击方式进行判断即可。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    //将触摸点坐标转换到在CircleButton上的坐标
    CGPoint pointTemp = [self convertPoint:point toView:_centerButton];
    //若触摸点在CricleButton上则返回YES
    if ([_centerButton pointInside:pointTemp withEvent:event]) {
        return YES;
    }
    //否则返回默认的操作
    return [super pointInside:point withEvent:event];
}

修改pointInside的方法后我们得到的程序如下

Sep-07-2024 12-24-33

无论我们点击按钮的哪个位置,按钮都可以正常响应啦。但是这个demo存在另外一个问题,如果给按钮添加旋转45度的动画的话,按钮会直接消失,可能是这个button旋转45度之后超出了正常下时的。所以我只能使用Core Graphics对图像进行旋转,关于Core Graphics框架的内容感觉后面会再进行学习,整理为一篇博客。

扩大按钮的响应范围

如果我们需要使用按钮来扩大它的响应范围10个像素,我们可以修改hitText的方法

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    CGRect extendedBounds = CGRectInset(self.bounds, -10, -10); // 扩大点击区域
    return CGRectContainsPoint(extendedBounds, point);
}

通过扩大button的原有范围,进行判断即可轻松的实现

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究 上一篇我们记录了编译器是如何找到最佳响应者以及响应者链的构成「OC」初识iOS事件处理流程,那么今天我们就来探究,UIResponder、UIGestureRecognizer、UIControl在处理事件时的优先级,以及相关的细节。让我们开始UIResponder、UIGestureRecognizer、UIControl的爱恨情仇吧先简单介绍一下本文的三个主角。 阅读详情

相关推荐

oc调用swift

OC调用Swift 如果你想在Objective-C工程中,嵌入Swift文件,实现OC调用Swift,那么这篇文章就能帮助你,由于本人最近在开发Swift项目,所以实现过OC调用Swift,在这过程中遇到过一些瓶颈,特此,将此文奉上,供大家参考。 OC调用Swift文件,需要创建桥接头文件,这个文件是当你在OC开发环境中创建Swift文件时由Xcode生成,该桥接头文件的命名是:-B

Xiao_Long_Li的专栏 2137

OC语法基础简单代码练习Demo

  没有接触过OC,所以今天就来学习下简单的东西.把一些简单的代码记录下来.   #import&lt;Foundation/Foundation.h&gt; #include&lt;stdio.h&gt; int main(int argc,const char* argv[]) { NSLog(@"Hello World"); printf("Hello OC\n"); r...

源码剖析之COCOS2D-X 1440

iOS UMeng OC和Swift混编

设置Objective-C桥接文件导入SDK头文件在UMengDemo-Bridging-Header.h中加入U-Share SDK头文件://导入UMCommon的OC的头文件//导入UShare的OC的头文件//导入UMAnalytics的OC的头文件//导入UMPush的OC的头文件UMengDemo的OC和Swift的切换UMengDemo是用OC的代码编写的,同时也兼容了swift3.0的调用示例(UMengDemo不再对swift2.0做示例兼容).

2501_90230875的博客 1701

「OC」实现简单的聊天室界面

在3Gshared之中的设置界面,我的信息之中需要写一个类似QQ的聊天界面,于是学习了聊天室是如何编写的,特此进行记录

aa2002aa的博客 951

探索多样的搜索界面样式:OCDemo项目设计指南

本文还有配套的精品资源,点击获取 简介:在IT领域,设计一个功能丰富的搜索界面对于提升用户体验极为重要。OCDemo项目演示了多种搜索界面的设计与实现,包含代码、资源及示例应用。本指南将深入探讨搜索界面设计的核心元素,如搜索框、按钮、筛选排序选项、即时搜索、语音搜索、清除功能、动画效果、响应式设计和错误处理,以及UI/UX设计的最佳实践。开发者可以通过这些资源学习如何运用这...

weixin_31620365的博客 1942

oc最基础操作demo

UITableView ,UIAlertController

在UIWebView中加载的HTML所触发的事件通过OC方法响应

  前段时间在做项目时,在UIWebView加载的Html中点击了一个区域需弹出拍照界面,可是根据业务的不同情况,区域的位置是不同的。我考虑了多种方案,最后还是觉得这个通过“桥梁”用OC方法来处理对应节点的触发事件更为直接和方便。   工具类:WebViewJavascriptBridge 顾名思义,此类就像OC与JS的桥梁,可以使JS的事件与OC的方法相关联。   WebView...

145

OC调用swift的DEMO

OC调用swift的DEMO

复杂页面布局框架IGListKit OC版本Demo

做App的时候,有时会遇到一些比较复杂一点的页面。 用Storyboard肯定是最方便的布局办法,这个时候需要注意一下自动布局各个尺寸的屏幕问题就行。 但是如果页面需要一个后续改动或者说是动态控制的页面(当然动态的页面用Web写更好)。这个时候就给大家介绍一个框架叫做IGListKit。 IGListKit在GitHub上官方的介绍为A data-drivenUI...

xmy0010的博客 7757

oc仿朋友圈demo

oc写的仿朋友圈的demo,包含了以下几个功能 1.朋友圈demo; 2.图片剪裁; 3.HTML页面解析。

OC-练习demo

1、使用Category,为NSArray添加两个公有方法;(10分) 1)计算NSArray中所有对象值的和(针对NSString及NSNumber对象) 2)实现查找功能(不使用系统自带查找方法,- (BOOL)containsObject:(id)anObject;使用类目实现其原理) 2、新建Teacher、Student类,并完成下列操作:(30分) (1) Teacher类持有5个学生(students),每个学生拥有姓名和4门课程考试分数集合;(5分) (2)实现Student的方法来计算当前学生的平均分;(5分) (3)声明一个Student的委托协议和必选一个协议方法,该协议方法可以在 学生计算完成平均分后告诉委托计算结果;(5分) (4)让Teacher遵守(3)中协议并与每个Student间建立委托的设计模式, 在Student平均分计算完成之后Teacher对每个学生平均分进行记录, 并输出。(10分) (5)给Teacher添加一个方法,将students数组中找出平均分最高的学生。(5分) 3、模拟一个商品销售系统,完成下列问题:(60分) 1)现有三种打折商品:书、茶杯、钢笔,每种商品都包含共有的三种属性: 编号、售价、折扣率,最终售价为当前售价与折扣率的乘积; 2)可将三种商品根据商品名称或则编号的形式,添加入购物车,客户不需要时,可移除购物车中指定的商品,客户可以随时查看购物车列表,显示购物车中所有商品的详细信息; 3)最后客户离开时,可以结账离开; 注意: 1)可封装一个类,专用于用户输入信息; 2)代码冗余的处理; 3)用户体验; 4)代码规范,命名、细节点处理;

从单向展示到实时交互:我用「魔珐星云」做了一个 OC 桌宠 Demo

已开源,欢迎来玩。

定期分享我的发现和想法,感谢你的陪伴和支持 1万+

OC-聊天Demol,私聊页面

OC-聊天Demol

oc传参数给js_使用JavaScriptCore实现OC和JS交互详解

JavaScriptCoreJavaScriptCore是webkit的一个重要组成部分,主要是对JS进行解析和提供执行环境。iOS7后苹果在iPhone平台推出,极大的方便了我们对js的操作。首先创建webView,读取本地的html文件NSURL* htmlURL = [[NSBundle mainBundle] URLForResource: @"demo" withExtension: @...

weixin_35318150的博客 365

js与oc交互demo

js与oc交互demojs与oc交互demojs与oc交互demojs与oc交互demojs与oc交互demo

腾讯股票接口API(1)——根据股票代码获取详情

获取股票简要信息,找来找去也没有找到官方的文档,都是复制粘贴的,这里先简单记录一下。 1.简要信息 以贵州茅台为例: http://qt.gtimg.cn/q=s_sh600519 // sh600519是贵州茅台的股票代码,根据自己的关键字拼接URL 可以直接在Android项目中请求,会得到如下一串字符串: v_s_sh600519="1~贵州茅台~600519~2075.95~42.95~2.11~38930~794942~~26078.04~GP-A"; 这里v_s代表简要信息,sh600519

GeofferySun的专栏 6万+

iOS OC实现MVVM Demo

最新一个iOS同事走了,有幸接过iOS开发,但我以前做WPF,android都是基于MVVM开发模式,在网查找了一些基于OC的开发,但总觉得有些方便。网上看到大多数都在Mode手动写getter和setter,在setter中执行协议中的更新UI方法,总觉得如果属生很多,写手setter/getter太麻烦,所以我做了一些变通,在 ViewMode中做一个块方法更新UI。废话少说,上代码 Mode User.h #import <Foundation/Foundation.h> NS_ASS

xiongyesno的博客 1411

Icarus Verilog和GTKwave使用简析

本简要介绍Icarus Verilog和GTKwave的使用,使用iverilog(Icarus Verilog)编译仿真verilog而使用GTKWave查看仿真数据波形下载安装 基本使用 iverilog使用 GTKWave使用 iverilog常用选项 使用库 注意

husipeng86的专栏 1万+

OC和Swift混编相互调用

现在咱们就一起学习下 OC和Swift混编,如何实现呢? 首先创建一个OC项目 这里不在做详细解释,直接进入 打开项目; 一 、添加swift 文件 (只要是混编 无论是在oc项目中添加swift文件 ,还是swift项目中添加oc文件) 会提示添加一个桥文件 名字为oc_swift-Bridging-Header.h下面都用这个名字(如图) 这个时候 我们只需要点击确定即可; 这个桥文件是用来添加 swift使用oc的时候导入头文件使用的 扩充 — 这个文件oc_swift-Bridging-Head

哈皮吖的博客 5468

AI上推荐 之 NeuralCF与PNN模型(改变特征交叉方式)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 1万+

使用pyqt5实现可勾选的测试用例界面

使用pyqt5实现可勾选的测试用例界面

天赐好车的博客 629

IOS (oc) 浅谈MVP在ios项目中的使用以及Demo

个人对于MVP思路的理解,就是开发过程中,数据和界面之间的交互,使用Presenter层管理,较于MVC模式:获取数据,构建对象,在控制器里赋值更新界面;MVP模式思路在获取数据,构造对象后,不直接在控制器中做界面交互逻辑,而是使用控制器层管理,将业务逻辑独立出来,这样便于代码的后期维护,同时降低了控制器的负担已经数据模型和控制器、界面之间的耦合性。 本篇文章以登录界面为例,使用ios的OC语言

flyToSky_L的博客 2906

如何在 SAP Server Side JavaScript 里消费 destination

在SAP云平台里打开SAP HANA Web-Based Development Workbench进行服务器端JavaScript的开发。 创建一个新的package: 创建一个新的application: 创建一个新的文件google-distance-api.xshttpdest用于维护destination相关信息: host = "maps.googlea...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 615
上一篇: 「OC」ViewController的生命周期
下一篇: 「OC」present和push操作区别以及混合推出的实现
小鹿撞出了脑震荡
博客等级 码龄3年 1107粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值