看源码的时候,发现了一个flat的用法,来返回一个新的cgfloat数值,为了弄懂为什么要这么做,我们来看一下
/*** 基于指定的倍数,对传进来的 floatValue 进行像素取整。若指定倍数为0,则表示以当前设备的屏幕倍数为准。** 例如传进来 “2.1”,在 2x 倍数下会返回 2.5(0.5pt 对应 1px),在 3x 倍数下会返回 2.333(0.333pt 对应 1px)。*/
CG_INLINE CGFloat
flatSpecificScale(CGFloat floatValue, CGFloat scale) {scale = scale == 0 ? ScreenScale : scale;CGFloat flattedValue = ceil(floatValue * scale) / scale;return flattedValue;
}
如果说苹果设备是固定ppi ,那就好计算了。。截了一份官网的ppi
,除了这个之外还有watch 设备等。。。拿这个去做适配得算死
命名格式的图片,
加载针对Retina屏的图片素材,否则会失真。
如果是label 记得添加了文字后 要用sizetoFit
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 110, 150)];
label.backgroundColor = [UIColor orangeColor];
[self.view addSubview:label];
/*CGRectGetHeight返回label本身的高度CGRectGetMinY返回label顶部的坐标CGRectGetMaxY 返回label底部的坐标CGRectGetMinX 返回label左边缘的坐标CGRectGetMaxX 返回label右边缘的坐标CGRectGetMidX表示得到一个frame中心点的X坐标CGRectGetMidY表示得到一个frame中心点的Y坐标*/
这个是框架做的横屏适配,之后我也 会按照这种写法。
//左边视图宽度 = 滚动视图宽度 / 2, 右边视图宽度 = 滚动视图宽度- 左边视图宽度CGFloat leftWidth = flat(CGRectGetWidth(self.scrollView.bounds) / 2)CGFloat rightWidth = CGRectGetWidth(self.scrollView.bounds) - leftWidth//左边视图高度 = logo图高度 + label顶部距离 + label高度CGFloat leftHeight = CGRectGetHeight(self.logoImageView.frame) + versionLabelMarginTop + CGRectGetHeight(self.versionLabel.frame)//左边视图最小Y数值 = (滚动视图高度 - 导航栏的底部高度)- 左边视图高度 /2CGFloat leftMinY = CGFloatGetCenter(CGRectGetHeight(self.scrollView.bounds) - CGRectGetMaxY(self.navigationController.navigationBar.frame), leftHeight)//logo图的frame = logo图的rect x =(左边视图宽度 -logo图宽度)/2 y = 最小y数值self.logoImageView.frame = CGRectSetXY(self.logoImageView.frame, CGFloatGetCenter(leftWidth, CGRectGetWidth(self.logoImageView.frame)), leftMinY)//版本label frame = 版本label的rect x = 和logo图的水平居中的位置 y = logo图加上高度self.versionLabel.frame = CGRectSetXY(self.versionLabel.frame, CGRectGetMinXHorizontallyCenter(self.logoImageView.frame, self.versionLabel.frame), CGRectGetMaxY(self.logoImageView.frame) + versionLabelMarginTop)//右边内容宽度 = 右边视图宽度 - 左右两边的边距CGFloat contentWidthInRight = rightWidth - UIEdgeInsetsGetHorizontalValue(padding)//访问官网的frame x = 左边宽度 + pading距离 y = logo图片的顶部 + 10 宽度 = 右边内容宽度 高度self.websiteButton.frame = CGRectMake(leftWidth + padding.left, CGRectGetMinY(self.logoImageView.frame) + 10, contentWidthInRight, buttonHeight)//功能列表的frame rect 和访问官网一致 y 和访问官网底部一致self.documentButton.frame = CGRectSetY(self.websiteButton.frame, CGRectGetMaxY(self.websiteButton.frame))//同上self.gitHubButton.frame = CGRectSetY(self.documentButton.frame, CGRectGetMaxY(self.documentButton.frame))//copyRightLabel 的高度 = 自适应一下,传入宽度 右边内容宽度CGFloat copyrightLabelHeight = [self.copyrightLabel sizeThatFits:CGSizeMake(contentWidthInRight, CGFLOAT_MAX)].height//copyRightLabel frame x = 左边宽度 + pading距离 y = 滚动视图高度 - 导航条底部 - 底部底部边距 - 高度,self.copyrightLabel.frame = CGRectFlatMake(leftWidth + padding.left, CGRectGetHeight(self.scrollView.bounds) - CGRectGetMaxY(self.navigationController.navigationBar.frame) - padding.bottom - copyrightLabelHeight, contentWidthInRight, copyrightLabelHeight)//滚动视图内容区域 = 宽度 为 屏幕宽度 高度=屏幕高度 - 导航栏的高度self.scrollView.contentSize = CGSizeMake(CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds) - CGRectGetMaxY(self.navigationController.navigationBar.frame))