iOS开发之适配,ios开发屏幕适配

iOS字体大小适配

在iOS开发中,有些公司对字体也有适配要求,为了让字体美观,所以在不同尺寸的屏幕上字体大小也要做到适配。

目前创新互联公司已为成百上千家的企业提供了网站建设、域名、虚拟空间、网站运营、企业网站设计、黄骅网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

自己总结了几种方法供大家参考。

方法一:用宏定义适配字体大小(根据屏幕尺寸判断)

方法二:用宏定义适配字体大小(根据屏幕尺寸判断)

方法三:(利用runTime给UIFont写分类 替换系统自带的方法)推荐使用这种

外部正常调用系统设置字体方法就行

注意:

作者链接:

iOS开发 - iOS15导航栏适配(Object-C、Swift)

Swift版导航栏适配参考

在iOS 13中给导航的 UINavigationBar 增加了 scrollEdgeAppearance 属性应用在iOS 14及更早版本的大标题导航栏上,在iOS 15中 scrollEdgeAppearance 属性适用于所有的导航栏

官方解释:描述当关联的UIScrollView到达与导航条相邻的边缘(导航条的上边缘)时要使用的导航条的外观属性。如果没有设置,将使用修改后的standardAppearance

scrollEdgeAppearance 与 standardAppearance 一样同属于 UINavigationBarAppearance 类型 父类是 UIBarAppearance

其中影响导航栏颜色、阴影涉及到以下属性

因为 scrollEdgeAppearance = nil ,当前控制器如果使用有 ScrollView 类的控件,当 ScrollView 向上滚动时 scrollEdgeAppearance 会默认使用 standardAppearance 的属性效果。所以 backgroundEffect 和 shadowColor 属性需要显式设置为nil,以防止 backgroundEffect、shadowColor 有颜色值影响导航栏透明效果。

下一篇:Swift版导航栏适配

PERFECT!

iOS开发:iPhone尺寸和适配

我们通常所说的iPhone5屏幕尺寸为4英寸、iPhone6屏幕尺寸为4.7英寸,指的是显示屏对角线的长度(diagonal)

PPI(Pixel Per Inch by diagonal):表示沿着对角线,每英寸所拥有的像素(Pixel)数目。

PPI数值越高,代表显示屏能够以越高的密度显示图像,即通常所说的分辨率越高、颗粒感越弱。

根据勾股定理

计算结果稍有出入,这是因为像素的离散采样有锯齿效应。

早期的iPhone3GS的屏幕分辨率是320*480(PPI=163),iOS绘制图形(CGPoint/CGSize/CGRect)均以point为单位(measured in points):

后来在iPhone4中,同样大小(3.5 inch)的屏幕采用了Retina显示技术,横、纵向方向像素密度都被放大到2倍,像素分辨率提高到(320x2)x(480x2)= 960x640(PPI=326), 显像分辨率提升至iPhone3GS的4倍(1个Point被渲染成1个2x2的像素矩阵)。

在同样的逻辑坐标系下(320x480):

为了自动适应分辨率,系统会根据设备实际分辨率,自动给UIScreen.scale赋值,该属性对开发者只读。

在同样的逻辑分辨率下,可以通过scale参数识别是iPhone3GS还是iPhone4(s)。以下基于nativeScale参数,定义了探测机型是否为iPhone6+的宏

--------------------------------------------------------------------------------那么,同样的分辨率和scale,如何区分机型iPhone4与4s、iPhone5与5s呢?通过[[UIDevice currentDevice] model]只能判别iPhone、iPad、iPod大类,要判断iPhone具体机型型号,则需要通过sysctlbyname("hw.machine")获取详细的设备参数信息予以甄别。

iPhone3GS时代,我们为一个应用提供图标(或按钮提供贴图),只需要icon.png。针对现在的iPhone4~6 Retina显示屏,需要制作额外的@2x高分辨率版本。

Phone6+在实际渲染时,downsampling/1.15(1242x2208-1080x1920),准确的讲,应该是@2.46x。苹果为方便开发者用的是@3x的素材,然后再缩放到@2.46x上。

参考: 一张图帮你看懂 iPhone 6 Plus 屏幕分辨率

1

该方法使用系统缓存,适合表视图重复加载图像的情形。同时该API根据UIScreen的scale,自动查找包含对应高倍图后缀名(@2x)的文件,如果找到二倍图,则image.scale=2.0,对应逻辑size大小以point度量(pixel度量的一半);如果没找到设置默认image.scale=1.0,对应逻辑size大小同像素尺寸。因此,

2

这组方法创建的UIImage对象 没有使用系统缓存 ,并且指定文件名必须包含明确的高倍图后缀。

3

//考虑  转屏  的影响,按照实际屏幕方向(UIDevice  Orientation)的宽高

//不考虑转屏的影响,只取竖屏(UIDevice OrientationPortrait)的宽高

待续

iOS开发技巧(OC版):关于iOS11适配的一些坑

在iOS11以前, 自定义UIViewController时, 从来没有考虑过topLayoutGuide和bottomLayoutGuide这两个属性.但是在iOS11出来之后,这两个属性被废弃,取而代之的就是safeArea的概念,safeArea是描述你的视图部分不被任何内容遮挡的方法。 它提供两种方式:safeAreaInsets或safeAreaLayoutGuide来提供给你safeArea的参照值,即 insets 或者 layout guide。 safeArea区域如图所示:

在除了iPhone X以外的型号手机上, UINavigationController 就是 topLayoutGuide区域. UITabBarController就是bottomLayoutGuide.但是这两个属性在iOS11已经被取代了. 取而代之的就是safeArea区域(iPhone X图区域4部分)

当我们自定义一个UIViewController, 内部嵌套了UINavigationController 或者UITabBarController的时候. 运行程序会出现以下错误:

原因是少了:

具体是为什么,没有细研究.不过解决办法如下:

因为我是创建的空项目所以只有LaunchScreen.storyboard..如果你的项目里还有Main.storyboard,那么 你需要把第四个勾勾也去掉.

区域一: 高度30

区域二:高度14

区域三:高度44

区域五:高度49

区域六:高度14

区域七:高度20

更新iOS11以后, UITabBarController上的图标文字由原来的垂直放置, 变成水平放置

iPhone X 横竖屏在尺寸上有很多细微的差别.

我们打印UINavigationController  navigationBar的时候发现他的高度为44.也就是上图绿色区域.但是在实际显示的时候确实红色区域,高度为32.整个高度向上12.也就是蓝色区域.

我们打印UITabBarController  tabBar的时候发现他的高度为32,就是橘色区域,红色区域为功能区,高度为21.我们是何止tabBar颜色的时,包括橘色区和红色区.

待更新

解决方案: 准备一张尺寸:1125 * 2436的启动图片,  添加到Assret中

解决方案: 通过改变按钮的 contentEdgeInsets和imageEdgeInsets的值成功改变了按钮的偏移问题,单独设置contentEdgeInsets也可达到一定的效果。

解决方案:iOS11弃用了automaticallyAdjustsScrollViewInsets属性,新增contentInsetAdjustmentBehavior来替代它

- (void)createView:(BOOL)useForRendering showRightAway:(BOOL)showRightAway;

{

if(_view == nil)

{

    NSString *deviceVersion = [self getDeviceVersion];

    if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])

    {

        CGRect bounds = CGRectMake(34, 0, 744, 375);

        _window  = [[UIWindow alloc] initWithFrame:bounds];

    }

    else

    {

        _window = [[UIWindow alloc] initWithFrame: _screen.bounds];

    }

  _window.screen = _screen;

  if(_screen == [UIScreen mainScreen])

    {

       _view = [[GetAppController() init] unityView];

        NSAssert([_view isKindOfClass:[UnityView class]], @"You MUST use UnityView subclass as unity view");

    }

    else

    {

        _view = [(useForRendering ? [UnityRenderingView alloc] : [UIView alloc]) initWithFrame: _screen.bounds];

    }

  _view.contentScaleFactor = UnityScreenScaleFactor(self.screen);

    [self updateScreenSize];

  if(showRightAway)

    {

        [_window addSubview:_view];

        [_window makeKeyAndVisible];

    }

}

}

- (NSString*)getDeviceVersion

{

struct utsname systemInfo;

uname(systemInfo);

NSString *deviceVersion = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

NSLog(@"添加获取手机型号方法 ++ %@", deviceVersion);

return deviceVersion;

}

- (void)updateScreenSize

{

CGSize layerSize    = _view.layer.bounds.size;

NSString *deviceVersion = [self getDeviceVersion];

if ([deviceVersion isEqualToString:@"iPhone10,3"] || [deviceVersion isEqualToString:@"iPhone10,6"])

{

    layerSize = CGSizeMake(744, 375);

}

CGFloat scale      = UnityScreenScaleFactor(_screen);

_screenSize = CGSizeMake(layerSize.width * scale, layerSize.height * scale);

}


文章题目:iOS开发之适配,ios开发屏幕适配
转载源于:http://scyanting.com/article/phgigg.html