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小窗口);
>两个横向控件 优先级约束
== 订单详情Label ==
由于右边的Label 是相对于左边订单详情Label约束的
左边的订单详情Label是根据内容自适应的,只给了左右约束
这时候设置完约束,需要左边的Label不能被压缩,因此需要设置
- Content Hugging Priority (内容拥抱) horizontal 优先级低于251、
- Content Compression Resistance Priority (抗压缩) horizontal 优先级高于750
这时候,右边的内容超出范围之后不会改变左边Label的自适应大小
也可以给订单详情label设置宽度值,选中宽度Constant约束 更改<=180
订单详情的label根据内容自适应大小,如果超过180 的话这时候会以…类型显示
>内容等分
引用自《简书》(fengyingjk)
storyBoard 内容等分约束
大体原理相同,更细致的操作可以自己琢磨一下