• 主页
  • iOS
  • Flutter
  • Java
  • Markdown
所有文章 关于我

  • 主页
  • iOS
  • Flutter
  • Java
  • Markdown

使用AutoLayout的一些坑

2016-05-14

使用Masonry和SnapKit的注意事项

  • 首先需要先添加到父视图在设置约束, 不然会崩溃
  • 两个视图相互添加约束的时候需要注意它们要有共同的大容器
  • 使用Masonry和SnapKit要做动画的时候
  • 首先更改约束(mas_update或者mas_remake)
  • 然后调用[view layoutIfNeeded];

    [UIView animateWithDuration:0.25 delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^{
        [view layoutIfNeeded];
    }];

最近使用SnapKit来给UITableViewCell添加约束, 以实现自动布局, 虽然最终结果正确,但是控制台有恼人的警告, 遂网上搜索了一般最终解决了!

1
2
3
NSLayoutConstraint:0x7fb743f46730 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fb743f4bfe0(353.333)]
Will attempt to recover by breaking constraint
SnapKit.LayoutConstraint:0x7fb743d03d00@/View/View.swift#121 PictureView:0x7fb743f74050.height == 374.0

UITableView和UICollectionView会默认添加两个约束就是UIView-Encapsulated-Layout-Width 和UIView-Encapsulated-Layout-Hight保证大小适中。

我在使用的时候,cell中的一个图片如果设置为固定的size就不会出现上述警告, 但是一旦根据图片的大小设置约束就会出现上述警告,这是因为系统设置的约束和我们动态设置的约束有冲突导致的.

解决方法1: 使自己创建的约束优先级高点或者低点

1
2
3
4
5
6
7
8
9
bottomBar.snp_makeConstraints(closure: { (make) -> Void in
//主要是设置bottomBar的bottom和contentView的bottom相同来决定cell的高度, 同时设置优先级为高或者低,
来解决和系统默认添加的约束冲突问题.
make.left.right.bottom.equalTo(self.contentView).priorityHigh()
make.height.equalTo(44)
make.top.greaterThanOrEqualTo(self.contentL.snp_bottom).offset(paddingV)
make.top.greaterThanOrEqualTo(self.pictureV.snp_bottom).offset(paddingV)
make.top.greaterThanOrEqualTo(self.videoV.snp_bottom).offset(paddingV)
})

解决方法2: 把cell的autoresizingMask设置为None(UIViewAutoresizingNone)

1
cell.autoresizingMask = UIViewAutoresizingNone

下面介绍一些调试约束问题的方法

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger    
  • command + 7 打开断点调试器
  • 点击左下方的+号,选择 Add Symbolic Breakpoint…
  • 在symbol里面添加 UIViewAlertForUnsatisfiableConstraints
    如图:添加symbolic breakpoint
  • 在控制台会打印类似错误:SnapKit.LayoutConstraint:0x7f8b1588b150@/Users/xxx/View/Cell.swift#121 PictureView:0x7f8b15892b70.height == 374.0
  • 使用po 0x7f8b15892b70 查看相关信息
  • po [0x7fc82aba1210 recursiveDescription] 可以看到层级关系
  • po [[0x7fc82aba1210 superview] recursiveDescription] 查看它的父视图的层级关系
  • 最后发现问题,解决它
  • iOS
  • 坑点
  • Objective-C
  • Swift
  • AutoLayout
  • Masonry
  • SnapKit
  • 三方框架的使用
Java语言基础08---包、内部类
Java语言基础07---多态、abstract、接口
© 2023 coppco
Hexo Theme Yilia by Litten
  • 所有文章
  • 关于我

tag:

  • Shadowsocks
  • VPS
  • 翻墙
  • First
  • 杂谈
  • 新尝试
  • Java
  • Flutter
  • Dart
  • Elicpse
  • IDE
  • Shell
  • Linux
  • Markdown
  • 资料整理
  • iOS
  • Android
  • CentOS
  • GitLab
  • git
  • 持续集成
  • Intellij IDEA
  • JavaScript跨域
  • Jsonp
  • Dubbo
  • 分布式服务架构
  • HTML
  • JavaScript
  • jQuery
  • BootStrap
  • CSS
  • JDBC
  • MySQL
  • 数据库
  • XML
  • Tomcat
  • HTTP
  • Servlet
  • Request
  • Response
  • JSP
  • Cookie
  • Session
  • 事务
  • JavaBean
  • AJAX
  • JSON
  • Listener
  • Filter
  • 注解
  • Servlet3.0
  • RPM
  • nginx
  • JDK
  • Oracle
  • Hibernate
  • Struts2
  • Spring
  • SSM
  • MyBatis
  • SSH
  • Spring MVC
  • MQ
  • Redis
  • 策略模式
  • 全文搜索技术
  • Lucene
  • Solr
  • mirror
  • 镜像站
  • ruby
  • npm
  • Freemaker
  • 坑点
  • Cocoapods
  • Objective-C
  • Xcode
  • Swift
  • SwiftUI
  • Spring Boot
  • WebSocket
  • GCD
  • Swift3.0
  • App瘦身
  • iOS和JavaScript交互
  • iOS应用跳转
  • math
  • AutoLayout
  • Masonry
  • SnapKit
  • 三方框架的使用
  • Gitlab
  • 编程思想
  • 逆向工程
  • Delphi

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

iOS、Objective-C、Swift、Java、Flutter