首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【iOS 开发】SnapKit 是怎样炼成的

前言 这是对 Swift 布局框架 SnapKit 的源码的一点分析,尝试搞清,一个好的布局框架,背后都做了些什么。...介绍 SnapKit 中的一些类 ConstraintView 等同于 UIView ConstraintAttributes 用于构造约束关系的各种元素(上下左右等) ConstraintDescription...ConstraintMakerEditable(继承 ConstraintMakerPriortizable) 在设定约束的宽度、高度以及偏移的时候,提供相应的加减乘除方法,返回 ConstraintMakerPriortizable...,它同时也就是一个 ConstraintView,ConstraintView 有一个 snp 的属性,这给我们提供了入口来通过 SnapKit 给任意的 UIView 或 AppKit 里面的 NSView...约束是如何作用的 到现在我们还是没说,从 snp 到 ConstraintMaker,再到 ConstraintMakerFinalizable 的 description 属性,到底哪里创建了 NSLayoutConstraint

1.3K31
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS-屏幕适配实现(SnapKit)

    SnapKit简介 SnapKit是一个优秀的第三方自适应布局库,它可以让iOS、OS X应用更简单地实现自动布局(Auto Layout) 下载链接 SnapKit SnapKit配置 使用pods方式引入类库...约束关系) make.attr.constrains make:可认为是要布局的view的代理 constrains:约束可能是多级的组合,比如make.left.equalToSuperview()....offset(50)的两级组合,显示找到父view的左边位置,再向右(X轴)移动50点 给控件添加、更新约束、引用约束、停用、启用 添加新的约束 testView.snp.makeConstraints...testView.snp.updateConstraints { (make) in } 引用约束,声明一个局部变量或者类属性来引用要修改的约束 var topConstraint: Constraint...注意 使用SnapKit添加约束之前,需要在addSubview之后才能使用,否则会导致崩溃 在添加约束时常会出现一些错误,约束出现问题的原因一般就是两种:约束冲突和缺少约束。

    51610

    读 SnapKit 和 Masonry 自动布局框架源码

    前言 一直觉得 SnapKit 和 Masonry 这两个框架设计和封装的很好,用起来的体验也是一致的,翻了下它们的源码,对其设计方式和涉及的技术做了下记录。文章打算围绕,给谁做约束?如何设置约束?...这三个问题看看 SnapKit 和 Masnory 分别是怎么做的,正好也能够窥探下作者是如何利用 Swift 和 Objective-C 两个不同语言的不同特性做到一致的使用体验的。...这样我们就可以在 UIView 中直接调用这些函数来进行视图的约束设置了。...如何设置约束? SnapKit 先看看这张图,里面是我们使用框架时用的最多的设置 make 的过程,图里将每个操作对应的不同 ConstraintMaker 做了说明。...设置完后如何处理? SnapKit 下面通过 makeConstraints 我们来看看 ConstraintMaker 是如何在外部通过一个闭包来写约束关系的。

    2.2K21

    Autolayout

    缺乏必要的约束, 比如 只约束了宽度和高度, 没有约束具体的位置 两个约束冲突, 比如 1个约束控件的宽度为100, 1个约束控件的宽度为110 代码实现Autolayout 代码实现Autolayout...700(优先级最大值为1000,优先级越高的约束越先被满足) V:[redBox]-[yellowBox(==redBox)] 竖直方向上,先有一个redBox,其下方紧接一个高度等于redBox...UILabel实现包裹内容 设置宽度约束为 <= 固定值 设置位置约束 不用去设置高度约束 基于Autolayout的动画 在修改了约束之后,只要执行下面代码,就能做动画效果 [UIView animateWithDuration...:1.0 animations:   ^{     [添加了约束的view layoutIfNeeded]; }]; Masonry框架的使用示例 下载地址: https://github.com/SnapKit...//添加两个控件 UIView *blueView = [[UIView alloc] init]; blueView.backgroundColor = [UIColor

    92860

    如何在onCreate中获取View的高度和宽度

    如何在onCreate中获取View的高度和宽度 在开发过程中经常需要获取到View的宽和高,可以通过View.getWidth()和View.getHeight()来得到宽高。...然而新手们经常在onCreate方法中直接调用上面两个方法得到的值是0! 这是为什么呢? 因为View绘制是通过两个遍历来完成的,一个measure过程,一个layout过程。...而这一切是发生在onCreate方法之后的。所以在onCreate中直接使用View.getWidth()和View.getHeight()是无法得到正确的值的。...那应该怎么onCreate中获取View的宽高呢?...开发者可以通过View.post()方法来获取到View的宽高,该方法传递一个Runnable参数,然后将其添加到消息队列中,最后在UI线程中执行。

    5.3K20

    iOS开发之Masonry框架源码解析

    本篇博客的主题不是教你如何去使用Masonry框架的,而是对Masonry框架的源码进行解析,让你明白Masonry是如何对NSLayoutConstraint进行封装的,以及Masonry框架中的各个部分所扮演的角色是什么样的...SnapKit其实就是Masonry的Swift版本,两者虽然实现语言不同,但是实现思路大体一致。...接下来讲分析这种链式的调用是如何实现的。...创建完约束对象后,我们要寻找该约束添加到那个View上。下方的代码段就是获取接收该约束对象的视图。如果是两个视图相对约束,就获取两种的公共父视图。...子啊添加约束是我们要判断是不是对约束的更新,如果是对约束的更新的话就先获取已经存在的约束并对该约束进行更新,如果被更新的约束不存在就进行添加。

    1.2K80

    深入剖析Auto Layout,分析iOS各版本新增特性

    约束变化 触发约束变化包括 Activating或Deactivating 设置constant或priority 添加和删除视图 这个Engine遇到约束变化会重新计算layout,获取新值后会call...它的superview.setNeedsLayout() Deferred Layout Pass 在这个时候主要是做些容错处理,更新约束有些没有确定或者缺失布局声明的视图会在这里处理。...*view1 = [[UIView alloc] init]; UIView *view2 = [[UIView alloc] init]; viewsDictionary = NSDictionaryOfVariableBindings...iOS7 NavigationBar,TabBar和ToolBar的translucent属性默认为YES,当前ViewController的高度是整个屏幕的高度,为了确保不被这些Bar覆盖可以在布局中使用...NSLayoutAnchorAPI 新增这个API能够让约束的声明更加清晰,还能够通过静态类型检查确保约束的正常工作。

    1.3K10

    30DaysOfSwift - Day1 计时器

    前几天逛Github,偶然看到一个Swift的项目 —— 30DaysOfSwift,作者一共用30个小项目,来熟悉Swift语言,而我正好也学习了一段时间的Swift语言,准备仿照这样的模式,来更加深入的了解...而我一直都是喜欢用纯代码布局,UI的搭建也是使用代码完成。所以我在写这个小Demo之前在我的项目里集成了SnapKit,使用类似Objective-C中常用的masonry框架来完成自动布局。...这是第一个Swift小Demo,很简单,也很好的帮助熟悉UI. import UIKit import SnapKit let SCREEN_WIDTH = UIScreen.mainScreen()...NSTextAlignment.Center return label }() //顶部背景试图 private lazy var topBackgroundView: UIView...= { let view = UIView(frame: CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: kTopViewHeight)

    81440

    如何获取Mathpix开发版的API key???

    首先,公布一个好消息,Mathpix for Matlab 1.0.0版已经完成全部开发工作,就差最后调试工作,稍等几日即可与大家见面,先报个界面预览: ?...这款软件之所以能够成功识别出各种纷繁复杂的数学公式,甚至是手写公式,得益于Mathpix提供的开发版公式识别API。...有账户的伙伴直接选择输入账户密码登录即可,没有账户的伙伴点击红框处的Sign up注册新账户即可。...支付方式添加完成后,点击OCR APIs进入API创建界面,点击Create Key即可创建相应的App ID和App Key,有了这两个参数,就可以轻而易举地调用Mathpix提供的开发版公式识别API...感谢大家的阅读,基于Mathpix开发版公式识别API的Mathpix for Matlab 1.0.0版即将与大家见面,敬请期待。

    2.8K10

    iOS表视图单元格高度自适应

    iOS表视图高度自适应可以节省很多麻烦,尤其是涉及到复杂的业务逻辑时,今天尝试了使用Masonry和FDTemplatelayoutCell来布局表视图单元格,从而达到单元格高度自适应的效果,这里就总结了这其中使用的要点和注意问题...: 1.Masonry设置的约束无效 我们要确定设置单元格子视图约束是相对于contentView的,如下的约束就是错误的。...因为在布局的时候是相对于self的,这样可能会使约束错乱,自适应高度无效。...因为我使用了xib文件来加载视图的,所以开始的时候写了如下方法获取单元格 //获取单元格 + (OrderTableViewCell *)getOrderTableViewCell{ NSArray.../Masonry Masonry的使用: https://github.com/SnapKit/Masonry/blob/master/README.md FDTemplateLayoutCell

    1.8K70

    iOS界面布局之四——使用第三方库Masonry进行autolayout布局

    并且有些时候,故事版并不能解决所有问题,某些控件必须我们手写,这样的话,我们就不得不进行代码的autolayout布局,幸运的是,Masonry可以帮助我们轻松愉快的完成这一任务。...二、使用Masonry         这里说的大部分内容均来自Masonry和官方gitHub,将其内容进行了翻译和解释,源地址如下:https://github.com/SnapKit/Masonry...2、3个方法让你玩转Masonry约束操作         Masonry在UIView的类别中,有3个全局的操作约束的方法,通过他们我们可以自由的进行autolayout的设置。...,并不会移除掉原有的约束,如果我们需要添加新的约束,可以使用下面的重设约束的方法。...        在添加具体约束的时候,我们不仅可以将约束值设置为绝对的相等关系,也可以设置一些值域的关系,在Masonry中,有如下三种: //绝对相等 - (MASConstraint * (^)(

    1.9K20

    Android实战经验分享之如何获取状态栏和导航栏的高度

    在 Android 应用开发中,有时我们需要知道状态栏和导航栏的高度,以便在布局中进行调整。获取这些高度的方法有几种,每种方法在准确性和兼容性方面有所不同。...获取状态栏高度的方法 方法一:通过资源名称获取 这种方法最常见,也最推荐,具有较高的准确性和兼容性。...: 0 } 获取导航栏高度的方法 方法一:通过资源名称获取 这种方法和获取状态栏高度的方式类似。...2、 通过 WindowInsets 获取: 优点:在较新版本的 Android 上非常准确。 缺点:需要较新的 API 级别,可能需要做额外的兼容性处理。...兼容性建议 对于支持的最低 API 级别较低的应用,建议优先使用通过资源名称获取的方法,因为这种方法在大多数情况下效果良好。

    46210

    设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框

    设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框     文本输入框是多数与社交相关的app中不可或缺的一个控件,这些文本输入框应该具备如下的功能: 1.在键盘为弹起时,输入框悬浮在界面底部...3.当输入的文字超出一行时,输入框应想用的进行高度扩展。 4.当输入框的高度达到某一极限值时,输入框高度不应继续扩展,文字区域应该支持滑动。     ...使用autolayout布局技术加上对键盘的相关监听,可以十分方便的实现上述效果。首先在xib文件中进行相关约束的添加,如下图: ?...将需要的属性与约束对象关联到文件中: //整体文本控件的高度     @IBOutlet weak var textViewHeight: NSLayoutConstraint!     ...//获取信息中的键盘尺寸和位置信息         let value:NSValue = info[UIKeyboardFrameBeginUserInfoKey] as!

    1.5K20
    领券