iOS StoryBoard边距及字体按屏宽比例适配

iOS StoryBoard

代码地址

>边距自适应

实现NSLayoutConstraint 分类 DoerFaFitLayoutConstraint

**************************.h文件实现****************************
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSLayoutConstraint (DoerFaFitLayoutConstraint)

/** 水平方向约束*/
@property (nonatomic, assign)IBInspectable CGFloat horizontalConstant;
/** 竖直方向约束 */
@property (nonatomic, assign)IBInspectable CGFloat verticalConstant;
/**单纯边距*/
@property (nonatomic, assign)IBInspectable CGFloat signleConstant;

@end

NS_ASSUME_NONNULL_END

**************************.m文件实现****************************
#import "NSLayoutConstraint+DoerFaFitLayoutConstraint.h"
#import <Objc/runtime.h>

#define kLayoutConstraintScreenWidth [[UIScreen mainScreen] bounds].size.width
#define kDeviceScaleConstraintFit kLayoutConstraintScreenWidth / 375.0
/** 375改为UI给定的实际图的宽度即可 */

@implementation NSLayoutConstraint (DoerFaFitLayoutConstraint)

- (void)setHorizontalConstant:(CGFloat)horizontalConstant {
    
    self.constant = horizontalConstant * kDeviceScaleConstraintFit;
    objc_setAssociatedObject(self, @selector(horizontalConstant), @(horizontalConstant), OBJC_ASSOCIATION_ASSIGN);
}

- (CGFloat)horizontalConstant {
    return [objc_getAssociatedObject(self, _cmd) floatValue];
}

- (void)setVerticalConstant:(CGFloat)verticalConstant {
    
    self.constant = verticalConstant *kDeviceScaleConstraintFit;
    objc_setAssociatedObject(self, @selector(verticalConstant), @(verticalConstant), OBJC_ASSOCIATION_ASSIGN);
}

- (CGFloat)verticalConstant {
    return [objc_getAssociatedObject(self, _cmd) floatValue];
}

- (void)setSignleConstant:(CGFloat)signleConstant{
    self.constant = signleConstant *kDeviceScaleConstraintFit;
    objc_setAssociatedObject(self, @selector(signleConstant), @(signleConstant), OBJC_ASSOCIATION_ASSIGN);
}

- (CGFloat)signleConstant{
    return [objc_getAssociatedObject(self, _cmd) floatValue];
}

@end

>字体自适应

实现UILabel 分类 DoerFit

== 注意这里的放大是按6s屏幕宽度放大的,也就是说设置fitSize之后的话 页面的布局则不应该指定控件的高度,让控件根据内容去适应 ==

**************************.h文件实现****************************
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UILabel (DoerFit)
/**字体大小*/
@property (nonatomic, assign)IBInspectable CGFloat fitSize;
/**是否按屏幕适配大小*/
@property (nonatomic, assign)IBInspectable BOOL isFit;

@end

NS_ASSUME_NONNULL_END
**************************.m文件实现****************************
#import "UILabel+DoerFit.h"
#import <Objc/Runtime.h>

#define kLayoutConstraintScreenWidth [[UIScreen mainScreen] bounds].size.width
#define kDeviceScaleLabelFontFit kLayoutConstraintScreenWidth / 375.0
//#define kDefalutFont
@implementation UILabel (DoerFit)

- (void)setFitSize:(CGFloat)fitSize{
   
    if (fitSize) {
       self.font = self.isFit?[UIFont systemFontOfSize:fitSize*kDeviceScaleLabelFontFit]:[UIFont systemFontOfSize:fitSize];
    }

    objc_setAssociatedObject(self, @selector(fitSize), @(fitSize), OBJC_ASSOCIATION_ASSIGN);
}

- (CGFloat)fitSize{
    return [objc_getAssociatedObject(self, _cmd) floatValue];
}

- (void)setIsFit:(BOOL)isFit{
    objc_setAssociatedObject(self, @selector(isFit), @(isFit), OBJC_ASSOCIATION_ASSIGN);
}

- (BOOL)isFit{
    return [objc_getAssociatedObject(self, _cmd) boolValue];
}


@end

======== 其他一些操作 ==========

>按钮返回

//A  ——>  B 之B ——> A 的按钮返回A里手动增加参数为UIStoryboardSegue*的方法
- (IBAction)backController:(UIStoryboardSegue *)sender{
   
}
print(之后在B页面的按钮 就可以拖拽线条到 A的Exit小窗口);

>两个横向控件 优先级约束

iOS StoryBoard边距及字体按屏宽比例适配_第1张图片
== 订单详情Label ==
由于右边的Label 是相对于左边订单详情Label约束的
左边的订单详情Label是根据内容自适应的,只给了左右约束

这时候设置完约束,需要左边的Label不能被压缩,因此需要设置

  1. Content Hugging Priority (内容拥抱) horizontal 优先级低于251、
  2. Content Compression Resistance Priority (抗压缩) horizontal 优先级高于750
    这时候,右边的内容超出范围之后不会改变左边Label的自适应大小

也可以给订单详情label设置宽度值,选中宽度Constant约束 更改<=180
订单详情的label根据内容自适应大小,如果超过180 的话这时候会以…类型显示

>内容等分

引用自《简书》(fengyingjk)
storyBoard 内容等分约束

大体原理相同,更细致的操作可以自己琢磨一下

你可能感兴趣的:(StoryBoard,Constant)