# ZIKConstraintsGuard
**Repository Path**: alexding_admin/ZIKConstraintsGuard
## Basic Information
- **Project Name**: ZIKConstraintsGuard
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-11-24
- **Last Updated**: 2023-11-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ZIKConstraintsGuard
A tool for debugging iOS view constraint.Monitor constraint conflict and crash problem below iOS7.
## Features
* monitor constraint conflict.
* monitor crash below iOS7 causing by layoutSubviews.
* callback with more information:
* the UIView where conflict happened
* the view controller
* all current constraints
* the constraint to be breaked
* view hierarchy
With the view and view controller, you can quickly find out the exactly wrong constraint and which view it came from.
## Apple's bug below iOS7
When implementation your custom view's `layoutSubviews`, remember:
* Call `[super layoutSubviews]`.
* Don't add constraints in `layoutSubviews`.
If not, adding subview to this view in iOS6 or iOS7 will crash you app with `'Auto Layout still required after executing - layoutSubviews..'` printed in console.Apple fixed this after iOS8.
Some system view like `UITableView`,`UITableViewCell` doesn't call `[super layoutSubviews]`. So don't add subview to them in iOS6 and iOS7, or you can use method swizzling to fix them.
If your app need to support iOS7,this will offer a great help,since Xcode8 can't debug iOS7 device any more.
## CocoaPods
To your podspec add:
```
pod 'ZIKConstraintsGuard'
```
## How to use
```
//monitor constraint conflict
[ZIKConstraintsGuard monitorUnsatisfiableConstraintWithHandler:^(UIView *view,
UIViewController *viewController,
NSLayoutConstraint *constraintToBreak,
NSArray *currentConstraints,
NSString *description) {
NSString *className = NSStringFromClass([viewController class]);
if ([className hasPrefix:@"UI"] && ![className isEqualToString:@"UINavigationController"]) {
NSLog(@"ignore conflict in system view:%@",viewController);
return;
}
//formatted description with enough debugging info, write to your log file
NSLog(@"%@",description);
}];
```
```
//monitor crash below iOS7
[ZIKConstraintsGuard monitorErrorFromLayoutviewsWithHandler:^(UIView * _Nonnull view, UIViewController * _Nullable viewController, NSString * _Nonnull description) {
//write error info to your log file before crash
NSLog(@"%@",description);
}];
```
## How it works
Hook private API to get the UIView.Then get other informations from the UIView.
API when meet unsatisfiable constraint:
```
-[UIView engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:]
```
API when system checking if view miss to call super layoutSubviews:
```
-[UIView _wantsWarningForMissingSuperLayoutSubviews]
```
These private API names were encrypted when using,in case you want to use this tool in an AppStore app.
___
一个调试iOS约束的工具。可以检测约束冲突和iOS7以下的crash问题。
## 功能
* 监控约束冲突。
* 监控iOS7以下系统UIView中的layoutSubviews导致的crash。
* 发生冲突时,回调附带更多关键信息:
* 冲突所在的view
* 冲突所在的view controller
* 目前所有的约束
* 系统将要打破的约束
* view层级
通过捕捉到的view和view controller,就可以快速地找到是哪个界面的哪个控件的哪个约束出现了问题。
## 自动布局在iOS7以下的bug
当你在实现自定义view的`layoutSubviews`方法时,记住:
* 调用`[super layoutSubviews]`
* 不要在`layoutSubviews`里增加约束
如果不遵守这两条,当你向这个view上增加子view时,在iOS6和iOS7上会crash,控制台会输出提示:`'Auto Layout still required after executing - layoutSubviews..'` 。iOS8开始则不会crash。
某些系统控件,例如`UITableView`,`UITableViewCell`没有调用`[super layoutSubviews]`,所以在iOS6和iOS7上不能在它们上面增加子view,除非你用method swizlling修复它们的`layoutSubviews`方法。
当你的app需要支持iOS7时,这个工具会提供很大帮助。因为Xcode8已经不支持iOS7的调试了。
## CocoaPods
添加:
```
pod 'ZIKConstraintsGuard'
```
## 使用方法
见英文部分:
[使用方法](#how-to-use)
## 实现原理
替换了两个私有API,获取对应的view,再从view里获取其他相关信息。
当遇到约束冲突时的API:
```
-[UIView engine:willBreakConstraint:dueToMutuallyExclusiveConstraints:]
```
系统用于检测当前view是否调用了`[super layoutSubviews]`的API:
```
-[UIView _wantsWarningForMissingSuperLayoutSubviews]
```
这些私有API名字已经经过混淆。