然而不怕一万,就怕万一,总会有万一的情况,而这种情况还是出现在了上线之后,一旦返回null就会让App崩溃。后来和后台沟通了一下为什么会返回null,并且希望后台不要返回null。...我们的后台使用PHP写的,后台开发人员告诉我,PHP是弱语法,返回的null也是自动生成的,有时返回的是null,有时返回的是“null”字符串,而有时返回的是“”空字符串。...于是上网查查是否有人也遇到过类似的问题,以及别人是怎么解决的,没想到真有人也遇到过这种问题,并且有解决方法。 解决后台返回的null导致的崩溃问题就是在项目中导入一个分类:NullSafe。...这个分类是一个外国的哥们写的,这个分类大概的作用就是将发送给null对象的消息发送给nil,这样就不会崩溃了。 下面的话都是网上的话,我只是重复一遍。...当我们给null发送消息的时候,会发生崩溃,而给nil发送消息不回发生崩溃。
画完置空 增加到 线数组中 fileprivate var allPointWidth = [CGFloat]() //所有的线宽 设置触摸时间,开始时记录第一个点并重绘(不重绘就没有只画一个点得效果...//路径起点 currentPointArray.append(point) self.setNeedsDisplay() } override func...touchesMoved(_ touches: Set, with event: UIEvent?)...//路径 currentPointArray.append(point) //刷新视图 self.setNeedsDisplay() } 由于我们的点都是存在数组中...在info.plist中添加Privacy - Photo Library Usage Description属性即可,value值为提示信息 ?
3大类:触摸、加速计、远程遥控 仅仅有响应者的子类,才干够接收和处理事件 父类响应者中定义的事件处理接口例如以下: 触摸事件处理的四个方法例如以下:(仅仅要实现,系统会自己主动调用)...(如位置、所点对象) 事件对象UIEvent,经常使用的属性是:事件类型 触摸的四个方法(即过程)具体解释:注意同一时候和一前一后触摸的情况 必须先找到事件的最合适的响应者(从父到子地找...) 以下是寻找最合适的事件响应者详细样例: 特殊情况:要尤其注意 找到了事件的最佳处理者之后,就是响应者链条了 默认是会调用其[super touchesXXX],这个super就是上一个响应者...即:官方文档中的next responder 以下是官方文档中关于上一个响应者的图片,即Next Responder 总结起来就是:view有控制器,则传给控制器;否则,传给父view...[self.pathArr addObject:currenPath]; [self setNeedsDisplay];}// 取出最新的贝塞尔路径,加入新的点进去- (void)touchesMoved
当你的view的内容变化时,不应当直接redraw这些内容。相反,应当通过setNeedsDisplay或者setNeedsDisplayInRect:method方法来使这些view失效。...之后,view几何属性的变化并不会经常导致bitmap被重新创建。取而代之的是,contentMode的值会决定bitmap是否应当去裁剪以适应新的bounds或者定位在某个view的边缘之上。...frame,boundsproperties的关系 a) frame是指在其父 中的坐标系统中的frame矩形属性; b) bounds是指在view自己的坐标系统中的...自定义的部分事件部分如下: a) Event-handling,例如touchBegan—touchesMoved—touchesEnded—touchesCancelled b)...,也就是接收键盘时间和其它touch相关事件的window。
核心就在于给每个节点View添加一个TouchesMoved事件,然后在TouchesMoved事件执行时,将触摸的移动点设置成当前View的Center即可。这样我们就可以拖动每个节点View了。...下方这段就是节点View的TouchesMoved事件,在该事件中我们获取到当前用户触摸移动的坐标点,然后将该点赋值给当前节点View的Center,然后调用更新父视图的闭包回调对象即可。...在上述方法调用setNeedsDisplay()方法后,就会执行View的draw()方法,我们就在此方法中进行线条的绘制。当然下方的代码比较简单,在此就不做过多赘述了。 ?...本部分我们只需要修改节点View,而节点View的父视图不做修改。 下方这段代码片就是为了让其自动变换所实现的方法。下方的这两个方法会替换掉第一部分的TouchesMoved方法。...就是给父视图添加了一个TouchesEnded事件,在点击的地方生成一个节点View即可。具体如下所示: ?
之后的每一行代表回溯中的一个堆栈帧,堆栈帧的每一列都包含崩溃时执行的代码信息。...对于非崩堆栈,这是控制权返回到该堆栈帧后执行的第一条机器指令的地址 第四列:在完全符号化的崩溃报告中,正在执行的函数名称。...如果这是崩溃线程的顶部帧,需要查看前面几个堆栈帧获得线索。 如果源文件的行号是0,意味着回溯不会映射到原始代码中的特定代码行。...因为编译器优化了代码(如:内敛),且崩溃时执行的代码与原始代码中的确切行不对应。此时框架的函数名仍然只是个线索。 ---- 5....Binary images 二进制图像,崩溃报告的二进制图片部分列出了终止时进程中加载的所有代码(如:应用程序可执行文件和系统框架)。
,那么手势的监听方法(在本例中为panActiona方法)就不会被调用!...所以在后面的触摸事件中,RedView的touchesEnded:withEvent:方法不再会被调用,而是调用CustomerGesture的touchesMoved:withEvent:方法和GestureVC...CustomerGesture继承UIPanGestureRecognizer, 在GestureVC.m中的createGesture()中添加gesture.cancelsTouchesInView...CustomerGesture继承UIPanGestureRecognizer, 在GestureVC.m中的createGesture()中添加gesture.delaysTouchesBegan =...在整个事件序列中(一个事件序列是:手机触摸屏幕,接着在屏幕滑动,最后手指离开屏幕),RedView的touches开头的4个方法都不会被调用!
,然后还要有撤销、清屏、橡皮擦的功能,那就需要画很多条路径了,然后每条路径有自己的颜色和宽度,那么 UIBezierPath类也实现不了,需要自定义一个类,继承自UIBezierPath,然后再增加自己的颜色和宽度属性...36 self.currentPath = path; 37 38 [self setNeedsDisplay]; //调用方法,重新绘制 39 } 40 41...//监听触摸移动中 42 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 43 //追踪每次路径的移动过程...@interface UIView(UIViewRendering)中添加的方法 56 //setNeedsDisplay方法也是此分类中的方法 57 - (void)drawRect:(CGRect...addTarget:self action:@selector(setLineWidth:) forControlEvents:UIControlEventValueChanged]; //绑定值改变事件
大家好,又见面了,我是你们的朋友全栈君。...,路过的大牛请勿喷),当我们创建 UIScrollView 或 UIImageView 时,当点击时UIScrollView 或 UIImageView 会截获touch事件,导致touchesBegan...: withEvent:/touchesMoved: withEvent:/touchesEnded: withEvent: 等方法不执行。...解决办法:当UIScrollView 或 UIImageView 截获touch事件后,让其传递下去即可(就是传递给其父视图UIView) 可以通过写UIScrollView 或 UIImageView...的category 重写touchesBegan: withEvent: / touchesMoved: withEvent: / touchesEnded: withEvent: 等来实现 ////
View管理应用程序可见内容 view是UIView类(或其子类之一)的一个实例对象,并在应用程序window中管理矩形区域。view负责绘制内容,处理多点触控事件以及管理任何子view的布局。...有关view controller和他们扮演的角色的更多信息, View Controller Programming Guide for iOS. view是应用程序中手势和触摸事件的关键接收者, Event...影响子view的其他更改包括隐藏superview,更改superview的透明度,或将数学变换应用于superview的坐标系。 View层次结构中的排列也决定了应用程序如何响应事件。...在前面的一系列步骤中,您自定义View的主要集成点是: 事件处理方法: touchesBegan:withEvent: touchesMoved:withEvent: touchesEnded...通过在按钮内部嵌入自定义图像view或标签来限制这些方法,如果按钮的实现发生更改,则可能会导致应用程序现在或将来某个时刻的行为不正确。
(2)[UIApplication sharedApplication].keyWindow(获取应用程序的主窗口)用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow...因此,你需要去请求视图重绘当视图的数据或者状态改变的时候。从这个意义上来说,向视图发送setNeedsDisplay消息。任何UIView对象标记为需要显示後将会在应用程序循环中自动重新绘制。...苹果要求我们调用UIView类中的setNeedsDisplay方法,则程序会自动调用drawRect方法进行重绘。....这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值). 1.如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。 ...调用super的目的就是为了把事件传递给nextResponder,并且如果我们在touchesBegan中没有调用super,则super不会响应其他的回掉(touchesMoved/touchesEnded
但是因为播控栏上很多按钮,当手势起始位置为按钮内时上滑别会被识别为 UIButton 的 cancel 手势,导致无法换起面板。...搜索了一番,也没找到解决方案,最后自己各种猜测➕测试,得出一个解决方案:按钮点击事件改用 Tap 手势实现,扩展 UIView 在 touchesMoved 方法里判断手势方向是否为上滑。...实现 1、实现 touchesMoved ,并新增 touchPoint 属性记录每次 touch 位置,并跟上一次比较,y 比上一次小,就判断为上滑 2、新增 didReceiveSwipeUp 属性...,回调上滑事件 typealias MOSwipeUpCallback = () -> () struct MOAssociatedKeys { static var touchPointKey...{ super.touchesMoved(touches, with: event) guard let touch = touches.first else { return
property(nonatomic,strong)CALayer *drawLayer;//添加画线子层 @end /*步骤: 1创建一个子层 在子层上上有一个图形 2创建一个子层 用来画线 并且记录在移动的过程中的路径...:self.view]; CGPathMoveToPoint(_path, nil, location.x, location.y); } -(void)touchesMoved...:(NSSet *)touches withEvent:(UIEvent *)event { if(_path) { //获得当前点 并将点添加到path中...CGPathAddLineToPoint(_path, nil, location.x, location.y); [self.drawLayer setNeedsDisplay...:(CALayer *)layer inContext:(CGContextRef)ctx { CGContextAddPath(ctx, _path);//将path加入到ctx中
二、配置属性、组件 应用程序的下一部分是在故事板中配置一些UIKit组件,其中一个是CircleView。...为了允许用户更改颜色,我已经定义了UIStepper控件,我还添加一个按钮,这将导致要使用的步进值来调整CircleView的颜色值。...根据故事板中配置的步进器的默认值,我触发了一组初始的圆形颜色。...一般来说,使用框架控件,当您设置属性(如显示标签或值)时,您将会使用该属性,这样会导致重新绘制控件,因为系统会实现对控件drawRect方法的调用。...所以我们需要调用setNeedsDisplay,明确地告诉系统必须重新绘制,从而显示新的颜色 由此,我们需要考虑三个重要的原则: 1、在iOS中,视图很明显会被缓存。
点击保存时会把绘制的图片保存到手机的相册中。下面是具体的实现方案。 ? ...一.封装画图板 其实上面的白板就是一继承于UiView的一个子类,我们可以在这个子类中添加我们画图板相应的属性和方法,然后实例化成对象添加到ViewController中,当然为了省事添加白板的时候是通过...storyboard来完成的,读者也可以自己实例化然后手动的添加到相应的ViewController中。 ...13 ]; 14 } 15 } (3)Redo操作和Undo操作相反,从未显示栈中取出元素放入显示的栈中,代码中的栈我们是用数组来表示的,代码如下: //ReDo...)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 2 { 3 UITouch *myTouche = [touches anyObject
这次支付宝手机客户端升级,把手势解锁那个功能去掉了,引起很多人的抱怨,觉得少了手势解锁的保护,个人信息容易泄漏了。。。...那么手势解锁功能是怎么是实现的呢,这里使用Quart2D来简单模拟一下, 先看下截图效果: ? ? ? 按钮的有两个背景图片,一个默认样式,一个用于选中样式: ? ?...64 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 65 //NSLog(@"触摸移动"); 66...; 82 btn.selected = NO; 83 } 84 85 self.moveP = CGPointZero; 86 [self setNeedsDisplay...UITouch *touch = [touches anyObject]; //获取当前接触点 109 return [touch locationInView:self]; //获取当前触点在父对象中的位置
一次完整的触摸过程中,只会产生一个事件对象,4个触摸方法都是同一个event参数。...发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中 UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口...… touchesMoved… touchedEnded… 1.3 UIView不接收触摸事件的三种情况 不接收用户交互userInteractionEnabled = NO 隐藏hidden =...touchesBegan… touchesMoved… touchedEnded… 这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理 这里写图片描述 如何判断上一个响应者...1)必须得自定义view 2)由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view的触摸事件 3)不容易区分用户的具体手势行为 3.1 方式二:手势识别功能
初始化变量 里面didMove大括号,我们需要初始化我们的变量:在我们的Player,操纵杆和旋钮GameScene.sks。 触摸 Touches 什么是没有触摸的iOS应用程序?...用户的手指和UI之间的交互可能是包含在设备或应用程序中的最佳发明之一,如果不是最好的话。为了控制我们的播放器,我们将使用触摸方法而不是手势识别器。...为了保持代码的有序性,我们将在Swift文件的最后一个结束括号之后创建一个扩展。稍后,我们将在该扩展中实现我们的触摸。 添加触摸 触摸事件分为三个阶段。...touchesBegan 由于我们已经为旋钮声明了变量,现在我们可以在触摸事件的三个阶段中设置这些变量。...touchesMoved 让我们回到我们的touchesMoved覆盖方法并填写一些代码。在那里,我们需要声明我们的操纵杆实际上是一个操纵杆,或者什么都不做并退出方法。
ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()、touchesCancelled...pointInSide()、hitTest()的关系:在button的hitTest()中返回button实例,这个button才能响应事件 2、button不同事件的识别,也是通过touchesBegan...()、touchesMoved()、touchesEnd()和touchesCanceled()来识别,所以如果你在你自定义的button里面的重写的touchesBegan: withEvent:方法中不调用...[super touchesBegan:touches withEvent:event];时,button的监听方法(在本例中为clicka:withEvent:方法)就不会被调用!...的监听对象的监听方法,在本例中调用的是ButtonVC(监听对象)的clicka: withEvent:方法(监听方法)。
2 addSubview的时候。 3当view的frame发生改变的时候。 4滑动UIScrollView的时候。 5旋转Screen会触发父UIView上的layoutSubviews事件。...6改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。...7.removeFromSuperview PS: init初始化不会触发layoutSubviews drawRect 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect...4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect PS: 重绘操作在drawRect方法中完成,不建议直接调用drawRect方法,当然调用此方法,结果没有任何效果的...我们调用UIView类中的setNeedsDisplay方法,则程序会自动调用drawRect方法进行重绘。
领取专属 10元无门槛券
手把手带您无忧上云