xib中的约束等比缩放实现

1,365 阅读2分钟

前言

苹果原生的约束规则,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就可以实时生效了,如下图

选择“on”的时候,就表示,当前的约束值,按比例等比缩放,没有设置过的,则遵循苹果原生的约束规范

swift实现

swift版本,我偷了个懒,没有用swift实现分类,oc中给类添加扩展使用category,可以添加属性,也可以添加方法,但是swift中使用extensions可以实现,但是extensions不允许直接添加属性,需要使用runtime运行时添加,这对于非界面化的需求可以满足需要。但是给xib中的NSLayoutConstraint添加分类,并且实时在xib中展现出来,就难了。

  • 首先确定方案是直接使用oc的category文件
  • 把oc文件导入swift项目中,会提示是否建立桥接文件,点击确定
  • 在桥接文件中,引入oc的category文件
  • swift加入了命名空间的概念,所以加入项目中的文件,无需手动引入,即可全局访问

这样就可以啦,和oc一样在xib中拉约束就行了