如果你在Designables 那里把Debug打开,然后断点打到initWithCoder 和 initWithFrame那里,会发现程序总是运行到这一行 self = [super initWithCoder...如果我们现在自定义View的时候也是相同做法,创建完Xib文件之后,File‘s owner关联好了之后。然后在Custom Class里面填上了我们自定义的类之后,这个时候就错了!...这里当然我们也可以仿照这个方法做,那我们需要把loadNibName写到另外一个类中去。class还是写自己本身,用那个类来加载我们这个View,这样就可以不崩溃,不会无限递归了。...由于现在我们自定义的class有了接管整个view的绘制权利,那么我们就应该在initWithCoder中loadNibName,把整个View在初始化的时候load出来。...根据上面的分析,我们找到崩溃的原因是无限递归,这里又必须要调用initWithCoder,我们的唯一办法就是把class改成父类的class,即UIView,这时候一切就好了,Xib/Storyboard
本篇主要内容: 1.理解视图与图层 2.CALyer寄宿图与contents属性 3.UIView方法绘制自定义寄宿图 4.CALyer方法绘制自定义寄宿图 5.Frame与Bounds的区别...我们在访问UIView的frame,bounds等属性又或者设置动画,其实也都是在操作其关联图层CALayer的特性。...contentCenter (CGRect) 定义一个固定的边框和一个在图层上可拉伸的区域 三、UIView方法绘制自定义寄宿图 给contents赋值CGImage的值并不是唯一设置寄宿图的方法...和UIViewController,如上述代码的演示就会造成崩溃; UIView本身携带的layer的代理就是自己,如果将一个layer的代理设置成它,那它本身的layer就会受到影响,通常表现为野指针崩溃...;而UIViewController在经历Push和Pop之后也可能被释放,造成野指针崩溃;所以,对于这个问题的解决方案是:创建继承于NSObject的类,用于实现CALayerDelegate并管理CALayer
drawRect简介 drawRect方法在UIView的使用上起着十分关键的作用。...该方法定义在UIView(UIViewRendering)分类里面,望文生义,该方法完成视图的绘制。...这个是由系统自动调用的,主要是在UIViewController中loadView和viewDidLoad方法调用之后; 如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用...若子类继承自其他View类则需要调用super方法以实现重绘。 若使用UIView绘图,只能在drawRect:方法中获取绘制视图的contextRef。...,但是UIImageView能不重写drawRect方法用于实现自定义绘图。
在 iOS 里,视图控件类,如果:UIView、UIViewController就有两个指定初始化器,分别代表从代码初始化、从Nib初始化 Convenience Initializers 便利初始化器是类...(结构体、枚举)的次要初始化器,作用是使类(结构体、枚举)在初始化时更方便设置相关的属性(成员变量)。...Objective-C Objective-C 在初始化时,会自动给每个属性(成员变量)赋值为 0 或者 nil,没有强制要求额外为每个属性(成员变量)赋值,方便的同时也缺少了代码的安全性。...当自定义一个类的时候,要么直接继承自NSObject,要么继承自UIView或者其他类。 无论继承自什么类,都经常需要新的初始化方法,而这个新的初始化方法其实就是新的指定初始化器。...根据这条规则,可以从NSObject、UIView中看出,由于UIView拥有新的指定初始化器-initWithFrame:,导致父类NSObject的指定初始化器-init退化成便利初始化器。
Example : MonoBehaviour { private void Start() { Camera uiCamera = UI.Camera; } } 二、UIView...视图 1.ViewLevel 视图层级 视图默认被分为以上层级,也可以通过更改该枚举实现自定义层级结构,当UI模块初始化时,系统会根据该枚举中包含的字段自动创建视图层级: 2.创建视图 以一个首页视图为例...,创建脚本HomeView,继承UIView视图基类: using SK.Framework; public class HomeView : UIView {} 将脚本挂载到视图预制体上,并将预制体放到...(); } } 使用UnloadAll函数可以卸载所有已加载的视图 UIView.UnloadAll(); 三、AnimationEvent 动画事件 动画事件分为OnVisible...Element Here”区域实现添加: 四个开关分别表示移动动画、旋转动画、缩放动画、透明度动画的开关: Tween动画的核心参数: Duration 动画时长 Delay 延时时长 From 初始值
: 1、init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 2、addSubview会触发...view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化 4、滚动一个UIScrollView会触发layoutSubviews 5、旋转Screen会触发父UIView...上的layoutSubviews事件 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 在苹果的官方文档中强调: You should override...layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。 反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。...,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded] 重绘 -drawRect:(CGRect)rect方法:重写此方法,执行重绘任务 -setNeedsDisplay
UIWindow widow是窗口,每个app都需要借助window将内容展现给用户看,在iOS中,使用UIWindow类来表示窗口,通常一个应用程序只创建一个UIWindow对象; 创建window示例代码...创建view的步骤如下: ①开辟空间并初始化视图(初始化时,给出视图位置和大小) ②对视图做一些设置(比如:背景颜色) ③将视图添加到window上进行显示 ④释放视图对象 视图创建代码: UIView...(1)创建UILabel与创建UIView的步骤很相似。 ①开辟空间并初始化(如果本类有初始化方法,使用自己的;否则使用父类的)。 ②设置文本控制相关的属性。...①开辟空间并初始化(如果本类有初始化方法,使用自己的;否则使用父类的); ②设置文本显示、输入相关的属性; ③添加到父视图上,用以显示; ④释放; 3)UITextField...6)输入控制: UITextField类提供了许多控制输入的API,包括密码模式、键盘样式、自定义键盘等(详见下表) ?
这也就意味着,YYText 的截断总是在富文本最后的,且只有一个。...想象一下,若此处不使用这些 BOOL 值,那么在绘制的时候框架也需要去遍历查找是否有自定义的 key,若有再执行自定义的绘制逻辑。...也就是说,这个遍历是必须要做的,要么在初始化时做,要么是绘制的时候做。...8、合并所有的附件 前面有讲到,YYTextLine初始化时会将所有的附件及其相关位置信息装到数组里面,那么这里遍历所有的 line 将附件相关数组合并到一起,那么之后的绘制就不需要再去遍历 line...YYText 富文本可以异步绘制,也可以在主线程绘制,创建布局类及其相关计算可以在任意线程,可以根据业务需求选择适合的策略。
)setNeedsLayout ——————– – (void)setNeedsDisplay – (void)drawRect layoutSubviews在下面情况下会被调用: 1、init初始化不会触发...layoutSubviews 可是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 2、addSubview会触发layoutSubviews...上的layoutSubviews事件 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 在苹果的官方文档中强调: You should override...layoutSubviews, 当我们在某个类的内部调整子视图位置时,须要调用。 反过来的意思就是说:假设你想要在外部设置subviews的位置,就不要重写。...,标记总是“须要刷新”的,能够直接调用[view layoutIfNeeded] 重绘 -drawRect:(CGRect)rect方法:重写此方法,运行重绘任务 -setNeedsDisplay
:viewRect]; 设置View的属性 UIView类有几个声明的属性来控制View的外观和行为。...对于具有自定义绘图行为的view,您必须重写drawRect:方法。 UIView类包含一个tag属性,您可以使用它来为各个view对象添加一个整数值。...运行时调整View的大小和位置 每当view的大小发生变化时,其subview的大小和位置都必须相应地改变。 UIView类支持view hierarchy中的view的自动和手动布局。...内置到UIView类中的动画支持可以轻松地将更改设置为查看属性。...更改view的所有权或delegate关系会导致绘图问题和应用程序中的潜在崩溃 如果您主要使用图层对象而不是view,则可以根据需要将自定义图层对象合并到view层次结构中。
你也可以在与标准视图呈现内容不同的地方设置自定义视图。 无论你是使用系统视图还是自定义视图,都需要理解由UIVIew和UIWindow类所提供的基础结构。这些类提供复杂的设施来管理视图的布局和显示。...理解这些设施是如何工作的对于确保在应用发生变化时视图可以正常工作是非常重要的。...视图结构的基本原理#### 表面上,你可能想去做的就是处理视图对象(UIView的子类).一个视图对象规定了视图上矩形区域,并且在矩形区域上处理绘画和触摸事件。...视图也可以是其他一些视图的父类,协调那些视图的位置和尺寸。UIView的大部分工作用于管理视图之间的关系,但也可根据自己的需要自定义视图默认的行为。 视图与核心动画层合力处理视图内容修改和动画显示。...在UIKit的每个视图都是由一个图层对象(通常都是 CALayer的子类)支持,这些图层管理视图的存储回存以及处理视图相关的动画。大部分的操作都得通过UIView的接口。
因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。...load会在类初始加载时调用 initialize会在第一次调用类的类方法或实例方法之前被调用 这两个方法是可选的,且只有在实现了它们时才会被调用。 共同点:两个方法都只会被调用一次。...然后在类的方法列表以及父类方法列表寻找对应的方法运行。...2.UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的 类,UIView的子类,可以通过重载这个方法,来让UIView...你自定义的方法不应该调用super。如果你需要对view做一些其他的定制操作,在viewDidLoad里面去做。
5旋转Screen会触发父UIView上的layoutSubviews事件。 6改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。...7.removeFromSuperview PS: init初始化不会触发layoutSubviews drawRect 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect...2、该方法在调用sizeToFit后被调用,。 3、通过设置contentMode属性值为UIViewContentModeRedraw。...4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect PS: 重绘操作在drawRect方法中完成,不建议直接调用drawRect方法,当然调用此方法,结果没有任何效果的...我们调用UIView类中的setNeedsDisplay方法,则程序会自动调用drawRect方法进行重绘。
三、关于UIDragInteraction类 所有可以接收拖拽行为的组件都必须通过这个类实现,这个类中属性意义列举如下: //初始化方法 - (instancetype)initWithDelegate...同样,对于任何自定义的UIView视图,我们也可以让其成为放置目的地,需要完成如下3步: 1.创建一个UIDropInteraction行为对象。...,这两个是面向协议编程的绝佳范例,首先在UIKit框架中只定义了这两个协议,而并没有相关的实现类,在拖拽行为的相关回调接口中,很多id类型的参数都遵守了这个协议,我们无需知道是哪个类实现的,直接进行使用即可...container:必须是在window上的view center:动画起点与终点 transform:进行变换 */ - (instancetype)initWithContainer:(UIView...Writing协议用来让数据支持提供给数据源,Reading协议让数据支持从数据源读出,用自定义的Person类为例: #import //遵守协议
但这些都是layer才有的属性,并没有提供给UIView,所以我在Attributes Inspector里面是没有办法设置的,并且,这里也不能设置边框颜色和阴影颜色,因为边框颜色和阴影颜色是CGColor...当然,现在的Xcode版本已经不会崩溃了,之前是一直会崩溃的,苹果把他的健壮性又加强了一点,越来越方便我们开发了,但是他也没有任何的错误提示,还是有缺点的,而且我们的异常断点也断不到,也不好找问题。...同时我们UI类的自定义属性也可以映射上去,那这个关键字要怎么用呢?...我先来自定义一个UIView,创建一个子类(如下图),然后在ViewController里面再拉一个UIView,水平垂直居中,宽高固定,指定一下class。...然后在RadiusView.h文件里面,我们可以随便自定义变量名,比如,圆角、边框宽度、边框颜色、阴影颜色、阴影偏移offset,然后把IBInspectable直接放到变量前面。
= @"kNoticationUpdateCartList"; 对于如果导入是UIKit类就使用UIKIT_EXTERN 如果是Founction使用关键词FOUNDATION_EXTERN 如果只在本类使用只用写实现...比如UIView的对应初始化方法为 - (instancetype)initWithFrame:(CGRect)frame UIViewController对应的为 - (instancetype)initWithNibName...局部的变量要初始化 属性有默认的值 所以我们不必须对于属性进行初始化 我之前遇到的一个BUG就是int类型没有初始化给我默认Nan造成崩溃 建议的写法 int index = 0; 不建议的写法 int...释放注册的通知和KVO的监听 不释放容易造成内存释放崩溃 养成习惯把按照方法功能到分类里面 对于一些有按照功能类型的方法划分在一个分类里面 分类和之前类写在同一个文件 建议的写法 @interface...; @end 不建议的写法 @interface UIView (Add) - (void)addCustomView:(CustomView *)customView; @end 尽量少在分类里面使用属性
我们总是追求更为酷炫的实现,如果足够仔细,我们不难发现一个好的动画通过步骤分解后本质上不过是一个个简单的动画实现。本文就个人搜集的一些动画相关的理论和实践知识做个小结,不足之处请勿见怪。...---- 理论 UIView只是CALyer之上的封装,更准确的来说,UIView是CALyer的简版封装,加上事件处理的集合类。...CALayer是QuartzCore库内的类,是iOS上最基本的绘制单元。...因此,我们也就不难理解为何UIView/NSView在CALayer上做了一层封装。...[ 1 0 0 1 0 0 ] CGAffineTransformIdentity /// 自定义矩阵变换,需要掌握矩阵变换的知识才知道怎么用。
iOS4之后苹果将大部分绘图的方法和诸如 UIColor 和 UIFont 这样的类改写为了线程安全可用,但是仍然强烈建议讲UI操作保证在主线程中执行。...CALayer 在iOS当中,所有的视图都从一个叫做UIVIew的基类派生而来,UIView可以处理触摸事件,可以支持基于Core Graphics绘图,可以做仿射变换(例如旋转或者缩放),或者简单的类似于滑动或者渐变的动画...CALayer类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些内容(像图片,文本或者背景色),管理子图层的位置。它们有一些方法和属性用来做动画和变换。...而Core Graphics/Quartz 2D的大部分绘制操作都是在主线程和CPU上同步完成的,比如自定义UIView的drawRect里用CGContext来画图。...AsyncDisplay通过抽象UIView的关系创建了ASDisplayNode类,ASDisplayNode是线程安全的,它可以在后台线程创建和修改。
设置是不生效的,只能在NavigationController中设置 所以如果你用的Storyboard中配置的NavigationController话,就必须为NavigationController添加一个自定义的类...另辟蹊径 创建一个UIView 设置该UIView的frame.size 和statusBar大小一样 设置该UIView的frame.origin 为{0,-20} 设置该UIView的背景色为你希望的...statusBar的颜色 在navigationBar上addSubView该UIView即可 UINavigationBar设置 上面说了状态栏 这里顺便把UINavigationBar也说了 我的配置...let appear = UINavigationBar.appearance(); //在早期版本上设置 不能全局的方式设置 会导致app崩溃 //appear.translucent = false...; 注意 1) appear.translucent配置在早期系统会崩溃,不建议配置,建议在ViewController中配置 2) 在translucent=true也就是透明时,barTintColor
无论如何,你总是需要一个提示框....在大多数时候,我相信"大家"的选择,对自己是可有参考价值的!...* 使用屏幕尺寸创建HUD的便利初始化方法...UIView *)view; /** * 显示HUD.你需要确保调用此方法时,主线程未被其他任务阻塞,以便于更新视图.当你已经在新的线程中开始(比如,使用NSOperation或者NSURLRequest...* 最好设置自定义视图宽高为 37x37(这是HUD内建指示器的边框值). */ @property (MB_STRONG) UIView *customView; /** * HUD代理对象
领取专属 10元无门槛券
手把手带您无忧上云