为插件创建类主要是规范,避免与其他插件的方法重名,方便调用 定义插件类 以上一篇文章编写的插件为例 class my_change_font_style{ } 在构造方法调用HOOK function...} 这里以字符串调用方法的方式与之前不同 array($this,'方法名称') 调用插件需要的方法并实例化类 我们将之前的插件精简如下 <?...php } } new my_change_font_style(); 打开后台程序正常执行 接下来我们将之前的插件转换为类的方式 为 要保存的字段名称 = 选项名称(my_test_option)+[字段名称] --> 设置字体样式<?
我们在应用程序中使用类一组类,你想在调试器中快速查看类中的值。默认情况下调试器不会展示自定义类的信息。 此时我们可以向类添加一个DebuggerDisplay的特性。此时调试器就会你想要显示的信息。...没加特性的效果是这样的: ?...当然你如果嫌上述要将一个个的属性都写上有点麻烦,DebuggerDisplay特性还可以直接访问this指针,但是使用this指针访问的任何属性在处理前都不会对属性的特性进行求值。...当然上述方式,你需要重写了ToString方法: public override string ToString() { return $"{Id} {Name...} {Age}"; } 如果通过上述方式你 没有获取你需要的值,你只需要工具->选项->调试,然后勾选箭头所指向: ?
这个项目里面自定义了过滤器,那么如何创建自定义过滤器呢? 模版过滤器必须要放在 app中,并且这个 app必须要在 INSTALLED_APPS中进行安装。...然后再在这个 app下面创建一个 Python包叫做 templatetags。再在这个包下面创建一个 python文件。...本项目中的python文件名字为print_timestamp.py 在创建了存储过滤器的文件后,接下来就是在这个文件中写过滤器了。...这个是创建了过滤器了,但是如何使用呢? 在HTML里面可以将数据库查询出来的时间进行展示,但是要转化为我们要的时间 我们首先是在HTML里面引入过滤器 ? 使用 ?...以上就是自定义过滤器,并且如何使用的流程
这个项目里面自定义了过滤器,那么如何创建自定义过滤器呢? 模版过滤器必须要放在 app中,并且这个 app必须要在 INSTALLED_APPS中进行安装。...然后再在这个 app下面创建一个 Python包叫做 templatetags。再在这个包下面创建一个 python文件。...本项目中的python文件名字为print_timestamp.py 在创建了存储过滤器的文件后,接下来就是在这个文件中写过滤器了。...这个是创建了过滤器了,但是如何使用呢?...在HTML里面可以将数据库查询出来的时间进行展示,但是要转化为我们要的时间 我们首先是在HTML里面引入过滤器 使用 以上就是自定义过滤器,并且如何使用的流程
iOS上的UIKit和Mac上的AppKit都为我们提供了创建具有原生外观的UI所需的所有基本核心构建块,但是我们经常需要自定义这些外观以适合我们的设计并为其定义布局。...同样,这是许多开发人员选择子类化并创建内置视图类的自定义变体的地方,就像这里的UILabel一样,我们将使用它来渲染标题: class TitleLabel: UILabel { override...尽管子类化是一项重要的语言功能,即使在面向协议的编程时代,也很容易将自定义设置与自定义行为混淆。我们并没有在上面的UILabel中真正添加任何新行为,我们只是在设置一个实例。...此外,由于扩展名可以限制为单个文件(通过添加private关键字),因此我们可以轻松地为需要创建特定视图的应用程序部分设置扩展名,只有一个功能即可: //我们只会在单个视图控制器中使用它,因此我们将范围设为私有...在这种情况下,“自动版式”的声明性确实很方便——我们可以预先指定所有约束,而不必重写任何方法或响应任何调用。 就像用于视图一样,工厂方法为我们提供了非常干净的调用方式。
一、了解UIInputViewController类 UIInputViewController是系统扩展支持键盘扩展的一个类,通过这个类,我们可以自定义一款我们自己的键盘提供给系统使用...首先,我们先来看一下这个类中的一些属性和方法: @property (nonatomic, retain) UIInputView *inputView; 键盘的输入视图,我们可以自定义这个视图。...@property (nonatomic, copy) NSString *primaryLanguage; 系统为我们准备了一些本地化的语言字符串 - (void)dismissKeyboard; 收键盘的方法...系统要求我们对键盘的布局要使用autolayout,并且只可以采用代码布局的方式,我们这里为了简单演示,将坐标写死: - (void)viewDidLoad { [super viewDidLoad...]; // 设置数字键盘的UI //数字按钮布局 for (int i=0; i<10; i++) { UIButton * btn = [UIButton
介绍 Swift 可以利用 OC 的 runtime 和 KVC ,在运行时向一个对象添加值存储,这种方式称之为Associated Object。...在使用 extension 扩展现有类的功能时,使用Associated Object的方式,可以将一个值 “关联” 到已有的要扩展的类上。该知识点在 iOS 开发中使用往往能优雅地解决很多问题。.../// 设置关联值 /// - Parameter object: 同上 /// - Parameter key: 同上 /// - Parameter value: 关联的对象,具体的关联的值 ///...,此时可以有如下几种方案: 创建 9 个按钮,逐一设置 通过 for 创建 9 个 UIButton,为 UIButton设置不同的tag,然后在点击事件里面用 switch case判断 自定义UIButton...,添加自定义属性 利用 Associated Object 绑定参数 class ViewController: UIViewController { // 不同的参数 let
//按钮初始化类方法 UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];//这里创建一个圆角矩形的按钮 //按钮初始化实例方法...,可以不管他 }; 注意: 默认情况下,当按钮高亮的情况下,图像的颜色会被画深一点,如果这下面的这个属性设置为no, 那么可以去掉这个功能 button1.adjustsImageWhenHighlighted... = NO; //跟上面的情况一样,默认情况下,当按钮禁用的时候,图像会被画得深一点,设置NO可以取消设置 button1.adjustsImageWhenDisabled = NO; //下面的这个属性设置为...是否在dealloc中对UIButton对象进行release操作,取决于UIButton初始化的方式。...如果使用 [[UIButton alloc]init]的方式,则需要主动进行release释放操作。
origin也是一个结构体,包含2部分内容:x和y(ios坐标系以左上角为坐标原点(0,0),以原点向右侧为X轴正方向,原点下侧为Y轴正方向);size同样是一个结构体,包含2部分内容:width和height...(1)创建UILabel与创建UIView的步骤很相似。 ①开辟空间并初始化(如果本类有初始化方法,使用自己的;否则使用父类的)。 ②设置文本控制相关的属性。...6)输入控制: UITextField类提供了许多控制输入的API,包括密码模式、键盘样式、自定义键盘等(详见下表) ?...①创建button对象(如果本类有初始化方法,使用自己的;否则使用父类的); ②设置按钮显示相关的属性; ③为按钮添加点击事件; ④添加按钮到父视图上...,用以显示; ⑤按钮无需释放(因为使用的是类方法创建的button)。
模式是一项管理复杂度的技术,几乎所有模式都遵循两个原则: 针对接口编程,而不是实现。 多用组合,少用继承。 很多模式看上去很类似,这是因为实现各种模式的方式一般就是继承和组合。...创建型模式简介 创建型模式将实例化对象的部分从系统中独立出来,它们将系统具体使用哪些类的信息封装起来,并隐藏了这些类是如何被创建和组合的,对外只提供一个通用接口。...于是我们考虑自定义几个 Label 和 Button: //MARK: - Hello 系列产品 class HelloButton: UIButton { init() { let...{ return GoodbyeButton() } } 然后修改 PageView,构造器以一个 UIFactory 对象为参数: class pageView: UIView...{ return HelloButton() } } 有一点需要注意,Swift 的private关键字的作用域是以文件为单位的,而不是类,所以虽然把HelloUiFactory
UI 控件事件处理方法; IBAction 事件绑定流程 : -- 需求 : 为UIButton 组件添加点击方法; -- 创建 UI 组件 : Interface Builder 中创建 UIButton...IBAction 属性 : 在接下来弹出的对话框中的 Connection 列表设置 为 Action, 将设置 IBAction 属性, 设置完毕后会自动生成点击事件回调方法, 之后在实现类中实现这个方法即可...自定义 UI 控件 (1) 自定义组件简介 自定义组件简介 : -- UIView 基类 : 所有的 UI 控件都继承了 UIView 基类, UI 组件在 UIView 提供的空白区域上绘制具体的细节..., 使用 command + option + 3 打开身份检查器, 由身份检查器上可以看到 其 Custom Class 属性为 UIView, 因此该界面的根控件时 UIView; -- 创建自定义类...Main.storyboard 中 : 在 Custom Class 属性中, 输入自定义类, 然后点击回车, 默认的 View 就会变成我们设置的自定义类; -- 演示效果 : 六.
首先创建一个类,继承自UItabBarController 然后在.m文件中: 这里我有两个宏定义: #define WIDTH (myView.frame.size.width / 4) //我在写...; @end 然后开始写自己想要的东西了,在viewDidLoad中: (1)删除继承父类而来的tabBar,自定义自己想要的视图,其frame为原来tabBar的frame。...;也需要实现视图的跳转: #pragma mark -- 自定义tabBar按钮的点击事件 -(void)clickBtn:(UIButton *)sender { //设置上一个按钮...self.selectedIndex = sender.tag - 1; } 然后就基本实现了一个视图控制器的功能了,自己还有什么需求可以往里加,使用就跟视图的标签视图一样使用就行,只是这里的按钮图片我都是在类里就赋值好了...; 这是我自定义的tabBarController下载地址,需要的可以下下来参考参考: http://download.csdn.net/detail/margaret_mo/9451753
即便是初级我想你可能也封装过自己的类,我也如此,只不过我愿意把这些写出来给不会的人看看。 学习编程的时候听老师讲过OC的三大特性,其中一个就是封装。...说到这不得不提“面向对象”这个术语了,简单理解封装好的模块就是一个对象,你使用这个模块就在面向对象编程。面向对象,是一种编程思想。 下面我以一个小控件为例,在封装的过程中逐步讲解。...底层是一个view,我们可以创建一个类继承UIView,然后在上面加控件。怎么做想好了,那我们需要公开哪些属性、方法供外界修改、使用呢?...入口方式很多,有工厂方法、自定义实例方法、系统的init、initWithFrame方法...这里我们选用initWithFrame。为什么选这个?因为我们需要随意设定这个控件的位置。...总结:一个好的封装控件要做到高内聚、低耦合。具体怎样做可能需要你以长久的时光付诸实践并且总结经验。
进行自定义,以达到我们的项目需求。...有几点值得说明一下: 设置所有UITabBarItem的文字属性在上一篇文章iOS项目——基本框架搭建中已经提到了,这里就不详细介绍了 【发布】按钮的初始化应该使用单例模式进行创建,因为我们项目中只有一个...【发布】按钮,所以使用单例模式更合理,本文采用懒加载的方式进行单例模式的创建 在 中添加【发布】按钮 [self.tabBar addSubview:self.publishButton]; 。...同样的,也有几点需要注意的: 【发布】按钮的初始化还是和上面一样,应该采用单例模式进行初始化,具体就不展开; 重写 方法时,应该先调用其父类的此方法 [super layoutSubviews]; ,...在iOS的TabBarItem是自带该属性和控件的,我们可以根据自己的需求进行配置,下图是iOS11中的配置文档,可以对提示数量、颜色进行自定义设置,还可以对提示文字的属性进行不同状态下的配置。
因为在分类中 @property 并不会自动生成实例变量以及存取方法,所以一般使用关联对象为已经存在的类添加 “属性”。...那么,你是否能为这种添加事件的方式携带另外的信息呢?...当用户按下按钮关闭该视图时,需要用委托协议(delegate protocol)来处理此动作,但是,要想设置好这个委托机制,就得把创建警告视图和处理按钮动作的代码分开。...方案2:关联Block体 除了上一个方案中的传统方法,我们可以利用关联对象为UIAlertView关联一个Block:首先在创建UIAlertView的时候设置关联一个回调(objc_setAssociatedObject...3.2 UIButton 除了上述的UIAlertView,这节以UIButton为例,使用关联对象完成一个功能函数:为UIButton增加一个分类,定义一个方法,使用block去实现button的点击回调
和上一篇手势解锁不一样,手势解锁只画了一条路径,从触摸开始--》触摸移动--》触摸结束 ,然后路径完成了,渲染出来就是手势解锁了; 这次涂鸦想做到的效果是可以画很多次线段或弧,每次又可以设置不同的宽度和颜色...,然后还要有撤销、清屏、橡皮擦的功能,那就需要画很多条路径了,然后每条路径有自己的颜色和宽度,那么 UIBezierPath类也实现不了,需要自定义一个类,继承自UIBezierPath,然后再增加自己的颜色和宽度属性...代码: 1、自定义PaintingBezierPath类继承自UIBezierPath类,增加一个自定义路径颜色的属性;自定义构造函数,设置颜色和路径宽度 PaintingBezierPath.h文件代码...// PaintingBezierPath.m 3 // tan_iosTwo 4 // 5 // Created by xiaom on 15/7/22. 6 // 7 // 为了自定义每个轨迹的宽度和颜色...v; 25 26 [self addReturnBtn]; //添加返回按钮 27 [self addDoodleSetWidthAndColor]; //增加设置涂鸦的宽度和颜色设置
UIButton 就是这种控件; -- 静态控件 : 继承了 UIView 基类, 该类控件与用户之间不能交互, 之前使用的 UILabel 就是这种控件; -- 被动控件 : 该类控件可以接受用户操作...; 为不同状态的 UIButton 设置样式 : -- "setTittle : forState :" 方法 : UIButton 不同状态 设置不同的标题; -- "setTittleColor...设置 不同的按钮中文本的阴影设置颜色; -- "setBackgroundImage : forState :" 方法 : UIButton 不同状态设置不同的背景图片; -- "setImage :...(2) 创建 Add Contact 按钮 创建 Add Contact 按钮 : 设置 UIButton 的 Type 属性类型是 Add Contact; (3) 创建 Info Light |...设置文本颜色 粉色, 阴影颜色 蓝色; (5) 创建 图片 按钮 创建 图片 按钮 : -- 设置 Type 参数 : 设置为 Custom; -- 设置 Default 参数 : 设置 Image
在主页面跳转子页面之前,设置子页面中的块语句属性将要执行的动作(回调函数)。这样,在子页面返回主页面时就会调用该回调函数来传递数据。...*)btn { //发送通知回传数据,回传的数据格式自定义,这里定义为dictionary类型 [[NSNotificationCenter defaultCenter] postNotificationName...适用场景:任何需要数据传递的场景都适用,但是传递数据的类型仅限于基本数据类型,不能用于自定义的对象类型。 传递方式:正向传值、反向传值。...使用步骤: 创建一个类,拥有一些属性用于保存数据,并实现单例方法 #import "KLDanliObj.h" static DanLi *danli = nil; @implementation...KLDanliObj + (instancetype) shardDanLiObj { //实现方法,判断是否为空,是就创建一个全局实例给它 if (danli == nil) {
,不得不说实在麻烦~ 中级 比较机智的做法是使用Storyboard提供的Runtime Attributes为控件添加圆角描边。...设置圆角、描边的Key为: layer.borderWidth layer.borderColorFromUIColor layer.cornerRadius clipsToBounds 这样做不用关联出属性...动态显示设置效果 直接使用的话只有在运行时才能看到效果, 例如要实时显示一个UIBUtton圆角、描边效果,需要创建一个类继承UIButton #import #import...@end 只要将button的Class选择该空白类即可 关于IBInspectable与IB_DESIGNABLE的使用详情可以参考这篇文章《谈不完美的IBDesignable/IBInspectable...可视化效果编程》
事务是通过CATransaction类来做管理,它没有属性或者实例方法,而且也不能通过alloc和init去创建它,它的常用操作如下: //1.动画属性的入栈 + (void)begin; //2.动画属性出栈...现在,我们就通过事务来设置动画做一个验证,代码如下: - (IBAction)changeColor:(UIButton *)sender{ [CATransaction begin]; //...测试隐式动画事务.gif 可以看到,CALayer颜色的渐变动画已经变为了3秒,而旋转动画由于是默认事务变化,仍然以0.25秒快速执行。...我们可以发现改变隐式动画的这种图层行为有两种方式: 1.给layer设置自定义的actions字典 2.实现委托代理,返回遵循CAAction协议的动画对象 现在,我们尝试使用第一种方法来自定义图层行为...测试隐式动画-自定义图层行为.gif 经测试,我们会看到colorLayer将会以从左到右推进过渡的形式改变色值;我们通过给layer设置自定义的actions字典实现了自定义的图层行为;
领取专属 10元无门槛券
手把手带您无忧上云