iOS开发-屏幕缩放因子 各种适配

iOS开发-屏幕缩放因子 各种适配

前言

iOS开发中会遇到各种机型屏幕的适配,下面就分享一个屏幕缩放因子的封装。

代码

  • 直接在NSObject上分类
  • NSObject+Layout.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

#define LDSWidth(width)              ([self lds_getWidth:(width)])//屏幕缩放因子
@interface NSObject (Layout)

//是否按垂直方向作为布局基准, default is YES for iPad,  is NO for iPhone
- (BOOL)lds_isBaseVertical;

//垂直布局基准方案
- (CGSize)lds_baseSize;
- (CGSize)lds_actualSize;

//水平所有内容宽度
- (CGFloat)lds_baseAllContent;

+ (CGSize)lds_baseSize;
+ (CGSize)lds_actualSize;

- (CGFloat)lds_getWidth:(CGFloat)originWidth;
+ (CGFloat)lds_getWidth:(CGFloat)originWidth;
- (CGFloat)lds_getSpaceWidth:(CGFloat)originSpace;

@end

NS_ASSUME_NONNULL_END
  • NSObject+Layout.m
#import "NSObject+Layout.h"

#define IS_IPHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)// 设备型号
#define IS_IPAD     ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
#define SCREEN_HEIGHT  [[UIScreen mainScreen] bounds].size.height// 设备全屏高
#define SCREEN_WIDTH   [[UIScreen mainScreen] bounds].size.width// 设备全屏宽
#define SCREEN_MAX (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define LDS_SCALE                    (IS_IPHONE ? (SCREEN_MIN/375.0) : (SCREEN_MAX/1024.0))
@implementation NSObject (Layout)

- (CGSize)inner_baseSize {
    CGSize baseSize;
    if ([self respondsToSelector:@selector(lds_baseSize)]
        || [self.class respondsToSelector:@selector(lds_baseSize)]) {
        if ([self respondsToSelector:@selector(lds_baseSize)]) {
            baseSize = [self lds_baseSize];
        } else {
            baseSize = [self.class lds_baseSize];
        }
    } else {
        if (IS_IPAD) {
            baseSize = CGSizeMake(1024, 768);
        } else {
            baseSize = CGSizeMake(375, 667);
        }
    }
    return baseSize;
}

- (CGSize)inner_actualSize {
    
    CGSize actualSize;
    if ([self respondsToSelector:@selector(lds_actualSize)]
        || [self.class respondsToSelector:@selector(lds_actualSize)]) {
        
        if ([self respondsToSelector:@selector(lds_actualSize)]) {
            actualSize = [self lds_actualSize];
        } else {
            actualSize = [self.class lds_actualSize];
        }
    } else if ([self isKindOfClass:UIView.class]) {
        UIView *tempView = (UIView *)self;
        actualSize = tempView.frame.size;
    } else {
        actualSize = [[UIScreen mainScreen] bounds].size;
    }
    
    return actualSize;
}

- (CGFloat)lds_spaceScale {
    CGSize baseSize = self.inner_baseSize;
    CGSize actualSize = self.inner_actualSize;
    
    CGFloat realContentWidth = LDSWidth(self.lds_baseAllContent);
    CGFloat actualAllSpace = actualSize.width - realContentWidth;
    CGFloat baseAllSpace = baseSize.width - self.lds_baseAllContent;
    CGFloat spaceScale = actualAllSpace / baseAllSpace;
    
    return spaceScale;
}

- (CGFloat)lds_getSpaceWidth:(CGFloat)originSpace {
    if ([self respondsToSelector:@selector(lds_baseAllContent)]) {
        return originSpace * self.lds_spaceScale;
    } else {
        return LDSWidth(originSpace);
    }
}

+ (CGFloat)lds_getSpaceWidth:(CGFloat)originSpace {
    return originSpace * LDS_SCALE;
}

//是否按垂直方向作为布局基准
- (BOOL)lds_isBaseVertical {
    if (IS_IPAD) {
        return YES;
    } else {
        return NO;
    }
}

- (CGFloat)inner_currentScale {
    if ([self respondsToSelector:@selector(lds_baseSize)] == NO
        && [self.class respondsToSelector:@selector(lds_baseSize)] == NO) {
        return LDS_SCALE;
    }
    
    CGFloat tempBaseWidth = 0;
    if ([self respondsToSelector:@selector(lds_baseSize)]) {
        tempBaseWidth = [self lds_baseSize].height;
    } else {
        tempBaseWidth = [self.class lds_baseSize].height;
    }
    if (tempBaseWidth == 0) {
        return LDS_SCALE;
    }
    
    if ([self respondsToSelector:@selector(lds_actualSize)]) {
        CGFloat width = [self lds_actualSize].height;
        return width/tempBaseWidth;
    } else if ([self isKindOfClass:UIView.class]) {
        UIView *tempView = (UIView *)self;
        CGSize viewSize = tempView.frame.size;
        CGFloat tempFloat = self.lds_isBaseVertical ? viewSize.height:viewSize.width;
        
        if (tempFloat == 0) {
            return LDS_SCALE;
        } else {
            return tempFloat/tempBaseWidth;
        }
    } else {
        return LDS_SCALE;
    }
}

- (CGFloat)lds_getWidth:(CGFloat)originWidth {
    return originWidth * self.inner_currentScale;
}

+ (CGFloat)lds_getWidth:(CGFloat)originWidth {
    
    CGFloat result = 0;
    if ([self respondsToSelector:@selector(lds_baseSize)]) {
        CGFloat tempBaseWidth = [self lds_baseSize].height;
        if ([self respondsToSelector:@selector(lds_actualSize)]) {
            CGFloat width = [self lds_actualSize].height;
            result = (width/tempBaseWidth) * originWidth;
        } else {
            result = LDS_SCALE * originWidth;
        }
    } else {
        result = LDS_SCALE * originWidth;
    }
    
    return result;
}

@end

使用

  • 视图的frame带
self.view.frame = CGRectMake(0, 0, LDSWidth(10), LDSWidth(10));
  • Masonry的偏移带

    [self.view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(self.mas_centerX);
        make.top.equalTo(self.mas_bottom).mas_offset(HNWidth(10));
        make.bottom.equalTo(self.mas_bottom).mas_offset(HNWidth(-10));
        make.width.mas_equalTo(HNWidth(1));
    }];
  • 圆角带
View.layer.cornerRadius = LDSWidth(16);
  • 字体带
_nameLabel.font = [UIFont systemFontOfSize:HNWidth(18)];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值