前言
苹果原生的约束规则,xib上拉的约束,都是固定值,但是有些需求,要求我页面上的各个约束都等比缩放,这样的话,我在xib上的约束值也应该等比例,这就需要修改constraint的值了
oc实现
oc的实现方法是给xib的NSLayoutConstraint添加属性,通过判断属性值,将constant按比例设值,如下
NSLayoutConstraint+Adaption.h文件
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface NSLayoutConstraint (Adaption)
@property(nonatomic, assign) IBInspectable BOOL adapterScreen;
@end
NS_ASSUME_NONNULL_END
IBInspectable可以让属性实时显示在xib上
NSLayoutConstraint+Adaption.m文件
#import "NSLayoutConstraint+Adaption.h"
@implementation NSLayoutConstraint (Adaption)
- (void)setAdapterScreen:(BOOL)adapterScreen{
if(adapterScreen){
CGFloat sw = [UIScreen mainScreen].bounds.size.width;
CGFloat rpx = sw/375;
self.constant = self.constant * rpx;
}
}
- (BOOL)adapterScreen{
return YES;
}
@end
oc中没有命名空间,写的category并不能自动生效,oc中把引用放入pch文件中,pch是在预编译时,全局引用的文件,因此,category就可以实时生效了,如下图

swift实现
swift版本,我偷了个懒,没有用swift实现分类,oc中给类添加扩展使用category,可以添加属性,也可以添加方法,但是swift中使用extensions可以实现,但是extensions不允许直接添加属性,需要使用runtime运行时添加,这对于非界面化的需求可以满足需要。但是给xib中的NSLayoutConstraint添加分类,并且实时在xib中展现出来,就难了。
- 首先确定方案是直接使用oc的category文件
- 把oc文件导入swift项目中,会提示是否建立桥接文件,点击确定
- 在桥接文件中,引入oc的category文件
- swift加入了命名空间的概念,所以加入项目中的文件,无需手动引入,即可全局访问
