[IOS]今天开始学UI---UIIView的transform和contentMode属性

UIViewContentMode详解 UIView有个UIViewContentMode类型的属性contentMode,可以通过它来修改视图的内容显示模式。 typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, UIViewContentModeScaleAspectFit, // contents 阅读详情

要想深入的了解UIView的transform属性

就必须要知道该属性的类型 


点开头文件 我们可以看到

struct CGAffineTransform {
  CGFloat a, b, c, d;
  CGFloat tx, ty;
}


该属性类型为结构体

里面共封装了六个参数,我们将依次讲解该六个属性,这六个属性其实可以分为3对属性(a,d) (b,c) (tx,ty)

ad缩放bc旋转tx,ty位移

我们可以对2d图片进行 缩放,旋转,平移 通过该六个 参数进行设置

假设坐标系内一点(x,y)经过如下图的变换之后得到新的(X,Y)

公式

    X=ax+cy+tx
    Y=bx+dy+ty

也许你看不懂上面的公式 但是我会接下去慢慢讲解 

1.当a = m ,d = n, b = c = 0, tx = ty =0;的时候 (m,n)代表任意常数

我们得到新的(X,Y)是什么 (ax,dy) 那这代表什么? 对 就是缩放 x 缩放成原来的a倍 y缩放成原来的d倍

CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)计算原理

2.当a=cosɵ,b=sinɵ,c=-sinɵ,d=cosɵ,tx=ty=0;的时候e 代表角度

X= x cos e - y sin e

Y= x sin e + y cos e

那么这个新坐标代表了什么呢?代表了点(x,y)经过依照原点(0,0)进行旋转 e 角度后变换后的新 (X,Y)

CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)计算原理

推导

旋转变换一般是按照某个圆心点,以一定半径 r 旋转一定的角度α,为了简单起见我们给出下面的情景

假定点A(x,y)想经过旋转变换到达B(x',y'),已知旋转角度α和点A坐标,计算出点B


要计算点B则分别计算他的x'和y'分量


3.当a = d = 1, b = c = 0.tx = m, ty = n;的时候

X= x + m

Y = y + n 

这代表什么? 简单的说就是x平移了 m,y平移了 n  

CGAffineTransform CGAffineMakeTranslation(CGFloat tx,CGFloat ty)计算原理

如果要综合起来进行变换(缩放,旋转,平移)我们也就得到了

CGAffineTransform CGAffineTransformMake (CGFloat a,CGFloat b,CGFloat c,CGFloat d,CGFloat tx,CGFloat ty);

讲的再多不如做的 我们动手实验一下

实验1:缩放

新建了两个不同背景色的UIView 镜像开局 唯一不同的就是其中一个x 缩放了 1.5倍 y缩放了1.5倍 缩放是以自身view的中心center缩放的

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];


    view1.backgroundColor = [UIColor redColor];
    view2.backgroundColor = [UIColor greenColor];

    view1.alpha = 0.5;
    view2.alpha = 0.5;

    view1.transform = CGAffineTransformMakeScale(1.5, 1.5);


    [self.view addSubview:view1];
    [self.view addSubview:view2];


}


最后得到的结果



实验2:旋转 默认是顺时针旋转

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];


    view1.backgroundColor = [UIColor redColor];
    view2.backgroundColor = [UIColor greenColor];

    view1.alpha = 0.8;
    view2.alpha = 0.8;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    label.center = CGPointMake(100, 100);
    [label setText:@"Hello World"];
    [label setTextAlignment:NSTextAlignmentCenter];
    [view1 addSubview:label];
    view1.transform = CGAffineTransformMakeRotation(M_PI_4);

    [self.view addSubview:view2];
    [self.view addSubview:view1];




}


最后得到的结果

同样镜像开局 加入UILabel只是为了看清楚旋转方向



看起来是非常的成功


实验3:平移

x+100,y+100

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];


    view1.backgroundColor = [UIColor redColor];
    view2.backgroundColor = [UIColor greenColor];

    view1.alpha = 0.8;
    view2.alpha = 0.8;

    view1.transform = CGAffineTransformMakeTranslation(100, 100);

    [self.view addSubview:view2];
    [self.view addSubview:view1];




}
结果上来看还是非常成功的


需要特别注意的是 以上三种方法 都是以 起始的center作为参考的

什么意思呢?就是说 哪怕以后再进行重复的变换并不会改变

view1.transform = CGAffineTransformMakeRotation(M_PI_4);

我们都知道 这是对当前的UIView顺时针旋转M_PI/4的角度

假如连续执行两遍并不会转M_PI_2的角度


很多时候我们进行连续变换的时候都需要根据上次的进行变换 而不是以起始点作为参照

这不用担心 本身提供的API提供给我们直接的方法进行调用

CGAffineTransform CGAffineTransformScale(CGAffineTransform t, CGFloat sx,CGFloat sy)

CGAffineTransform CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)

CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)

这个方法去掉了Make字母 同时添加了一个新的参数CGAffineTransform t

该参数代表了上次进行转换的状态

如果要连续进行三次旋转M_PI/4角度 很简单 

咱们直接上代码 不废话

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];


    view1.backgroundColor = [UIColor redColor];
    view2.backgroundColor = [UIColor greenColor];

    view1.alpha = 0.8;
    view2.alpha = 0.8;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    label.center = CGPointMake(100, 100);
    [label setText:@"Hello World"];
    [label setTextAlignment:NSTextAlignmentCenter];
    [view1 addSubview:label];
    view1.transform = CGAffineTransformMakeRotation(M_PI_4);
    view1.transform = CGAffineTransformRotate(view1.transform, M_PI_4);
    view1.transform = CGAffineTransformRotate(view1.transform, M_PI_4);


    [self.view addSubview:view2];
    [self.view addSubview:view1];
    
    
    
    

结果确实旋转了M_PI/4*3的角度



是不是觉得很有意思呢?




接下来我们来点轻松的UIView的contentMode属性

同样头文件是我们最好的导师

我们去扒扒看

typedef NS_ENUM(NSInteger, UIViewContentMode) {
    UIViewContentModeScaleToFill,
    UIViewContentModeScaleAspectFit,      // contents scaled to fit with fixed aspect. remainder is transparent
    UIViewContentModeScaleAspectFill,     // contents scaled to fill with fixed aspect. some portion of content may be clipped.
    UIViewContentModeRedraw,              // redraw on bounds change (calls -setNeedsDisplay)
    UIViewContentModeCenter,              // contents remain same size. positioned adjusted.
    UIViewContentModeTop,
    UIViewContentModeBottom,
    UIViewContentModeLeft,
    UIViewContentModeRight,
    UIViewContentModeTopLeft,
    UIViewContentModeTopRight,
    UIViewContentModeBottomLeft,
    UIViewContentModeBottomRight,
};

看来头文件描述不全面啊?所以我们还是去看官方文档里面到底怎么描述这些枚举量的

1.UIViewContentModeScaleToFill:将内容按照本View的长宽比进行缩放

比如一张图片 200x200 我们要放进100x150的UIImageView里面去

嗯 200x0.5= 100 200x0.75=150  

所以我们看到的图片是这样的


这里面我放两个UIImageView 下面的是200x200的状态下的显示 而上层则是100x150 看样子是填充满了的说


2.UIViewContentModeScaleAspectFit:图片保持原比例 200x200的放进 100x150 最后变成100x100 那么剩下的位置怎么办 透明

所以就得到下图 注意红色方框


3.UIViewContentModeScaleAspectFill:图片保持比例填充满 部分内容可能被截断以填充视图的边界。

到底是啥呢?实际上两个红块区域就是被裁减部分 但是被裁减部分 仍然显示在边界处


4.UIViewContentModeRedraw:这个我也不太明白? 貌似意思是当视图改变时  重绘?

5.UIViewContentModeCenter:就是图片的中心在该View的中心 但是超出部分 照常存在 就是这么任性


6.UIViewContentModeTop:上边对其 但是超出部分 管我啥事呢?

红色 原本View的bounds 蓝色参照View 的bounds


7.UIViewContentModeBottom下边对齐 效果类比上可得
8.UIViewContentModeLeft 左边对齐
9.UIViewContentModeRight  右边对齐

10.UIViewContentModeTopLeft 左上角对齐

11.UIViewContentModeTopRight 右上角对齐

12.UIViewContentModeBottomLeft 左下角对齐
13.UIViewContentModeBottomRight  右下角对齐


施工完毕

that's all

thx


Everything you see on Screen is UIView.

iOS UIViewContentMode 详解:图片适配、缩放原理与实战场景 在 iOS 开发中,视图内容适配是一个基础且高频的技术点,它直接关系到应用界面的精细度与用户体验。其核心原理在于如何处理内容尺寸与视图边界之间的几何关系,本质上是定义内容在边界矩形内的布局算法。从技术价值看,深入理解这一机制能帮助开发者避免编写冗余的布局代码,精准控制视觉呈现,从而提升 UI 代码的优雅性与性能。常见的应用场景包括用户头像展示、Banner 图适配、列表图片显示以及自定义绘制视图等。本文将以 `UIViewContentMode` 为核心,结合 `scaleAspectFill` 和 `sc 阅读详情

相关推荐

基于eNSP的小型企业网络设计

在本次计算机网络课程设计中,围绕“小型企业网络搭建”这一主题,成功构建了一个高效、安全且易于管理的企业内部网络。通过本次课程设计,我们不仅掌握了小型企业网络搭建的关键技术和最佳实践,还培养了团队协作和问题解决的能力。本项目所构建的网络系统不仅满足了当前的业务需求,还具备良好的可扩展性和灵活性,为企业未来的数字化转型奠定了坚实的基础。

m0_67403143的博客 1442

UIView.ContentMode样式详解

内容会被缩放,以保持宽高比,同时会填充整个视图。:内容会放置在视图的中心位置,保持原始大小(如果内容超出了视图的边界,则可能被裁剪)。:内容放置在视图的左上角,保持原始大小,可能导致右和下部分被裁剪。:内容放置在视图的右上角,保持原始大小,可能导致左和下部分被裁剪。:内容放置在视图的左下角,保持原始大小,可能导致右和上部分被裁剪。:内容放置在视图的顶部,保持原始大小,可能导致底部被裁剪。:内容放置在视图的底部,保持原始大小,可能导致顶部被裁剪。:内容放置在视图的左侧,保持原始大小,可能导致右侧被裁剪。

炫目萧萧的专栏 2831

4、I3C协议详解

I3C最初的设计目的是为移动设备创建一个能够使用多个传感器的单一接口。随着现代化移动设备对于传感器数量的增加以及对性能的提高,I2C和SPI已经达到了他们所能支持的临界点,而I3C的出现就是为了解决这一问题,I3C可以在同一根主线上支持更多的传感器设备,而且不会因为要支持中断或睡眠模式而增加额外的逻辑信号。I3C可以在更低功耗的情况下提供更快的传输速率,该特性的提升不止是对移动设备,对其他的嵌入式设备也都是很大的帮助。例如穿戴设备,需要在有限的物理空间中使用多个传感器并且要求更小的耗电。 一、简述..

迟子涵925的博客 2万+

iOS UIViewContentMode 不同效果图文对比

图片的宽度或者高度(至少一个)恰好与视图的宽度或者高度相等;图片的宽度或者高度(至少一个)恰好与视图的宽度或者高度相等;如果宽高比相同,等比例缩放;如果宽高比不同,会变形塞入;

RollingPin的博客 1932

【Bug已解决】Request timed out / API Timeout — Claude Code 请求超时解决方案

方案适用场景推荐指数难度方案一:增加超时大任务处理⭐⭐⭐⭐⭐低方案二:切换 SonnetOpus 太慢⭐⭐⭐⭐⭐低方案三:缩小范围大代码库⭐⭐⭐⭐⭐低方案四:优化网络网络延迟高⭐⭐⭐⭐中方案五:减少 MCPMCP 超时⭐⭐⭐中方案六:流式响应长生成任务⭐⭐⭐低根本原因:请求超时最常见原因是请求体过大(35%)和 Opus 模型推理慢(25%),默认 60 秒超时阈值对大型任务不够最佳实践。

一键难忘的博客 5158

玩转企业微信群机器人:一份超详细的Webhook消息推送指南

企业微信群机器人是一个连接内部协作与外部服务的强大桥梁。通过灵活运用本文介绍的各种消息类型,你可以构建出丰富多彩、信息明确的自动化通知系统,极大地提升团队沟通效率。现在,就动手试试,将你的第一个机器人集成到工作流中吧!如果你有任何有趣的机器人应用场景或遇到了问题,欢迎在评论区留言交流!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3974

UIView的contentMode属性总结

UIView的contentMode属性最初知道这个属性还是以前面试的时候,面试官看到我app的一个图片有些变形,于是考了我这个问题。确实之前没有仔细思考过,一堆枚举值看上去也挺头疼,这次把它总结一下。我们知道,定义的UIView的frame大小,和它实际需要显示的内容的大小并不总是一直的。这个问题在使用UIImageView的时候格外容易发生。很有可能图片的真实大小、长宽比例和定义的frame不

KT的iOS开发小站 1万+

采用了fluent模拟了平壁面结霜过程。udf,很经典,可以试试。

利用该模型作为FLUENT中的源项,模拟了在局部冷却下冷表面上的霜形成,以预测霜的形态、温度分布和霜的重量,结果与实验结果吻合良好。结果显示,霜首先围绕冷却块形成,然后逐渐向其他方向扩展,冷却块上方的霜密度最大。随着时间的推移,平均霜厚度逐渐增加,生长速率减慢,而平均霜密度随增长速率变快而增加。相变传递微观过程与机理、蒸发及冷凝换热、强化传热、高效传热管、热泵、制冷、节水节能新技术、电子元器件冷却、余热回收及梯级利用等。udf,很经典,可以试试。工程热物理、空调、热能、低温制冷、化工、物理等。

qq_15963745的博客 921

iOS开发——UIImageView的contentMode、裁剪和layer属性详解

在我们iOS开发过程中,UIImageView是一个非常常见的控件,但是我们未必会用的很溜,因为里面的有些属性不曾注意,或者很难理解。所以会对我们使用该控件带来麻烦,在布局UI过程中可能会造成意想不到的结果。这篇博客主要来讲解UIImageView中的contentMode属性以及和图片裁剪的关系,并且不得不提到就是所有UIView的重要属性:layer(CALayer)。文中提到的所有·示例代码

乞力马扎罗的雪CYF的博客 1万+

AgentScope 实战训练营-A2UI的完整实现:从概念到部署全流程

本文详细介绍了如何在AgentScope框架中实现Google的A2UI(Agent-to-Agent UI)协议,构建一个能生成可交互UI的智能体应用。文章涵盖了从环境准备、架构设计、核心代码实现到测试部署的完整流程,包括A2UI协议解析、技能系统、客户端实现、通信机制等核心技术点,适合AI Agent和前端开发人员学习参考。

program哲学 201

一分钟了解OpenSpec (规格)

OpenSpec是由Fission AI开源的轻量级规范驱动开发(SDD, Spec-Driven Development)CLI工具。它专为AI编程助手(如Cursor、Claude Code)设计,核心是**“先约定,后编码”:在AI写代码前,先通过结构化规范文档达成共识,让开发过程可预测、可审计、可协作**。轻量无侵入:单CLI、无依赖、不改造项目、1分钟接入存量友好:增量Spec、不重构旧文档、1→n王者完全可控:每步审查、AI按图施工、零返工协作利器。

h a 6 6 6 c k 为 你解决复杂难题! 2745

uiview contentViewmode

UIViewContentModeScaleToFill  //铺满整个frame,     UIViewContentModeScaleAspectFit,      // 高度或者宽度铺满整个frame (有透明部分)     UIViewContentModeScaleAspectFill,     // 让高度或者宽度铺满frame(没有透明部分)     UIViewContent

Jack930820的专栏 759

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

UIViewContentMode解释

UIViewContentmode的含义 UIView有个UIViewContentMode类型的属性contentMode,可以通过它来修改视图的内容显示模式。 1)UIViewContentModeScaleToFill: 个人理解:根据视图的比例去拉伸图片内容 充满整个视图; 官方解释:The option to scale the content to fit the size o

waiilaiiz的博客 770

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

UIViewContentMode各模式的含义和效果

在iOS应用开发中我们常常要对视图的contentMode属性进行设置,尤其在使用UIImageView视图时设置这个属性的概率很高。我们知道contentMode的类型是UIViewContentMode的枚举,那么其每个值是什么含义,设置后会有什么效果呢?下面就来总结下。

赤条条的博客 5248

iOS设置UIView的contentMode

contentMode是UIView的属性,可以设置内容展示模式。 typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed asp...

培根芝士的专栏 2799

UIView之【UIViewContentMode】

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33748818的博客 212

UIView的contentMode使用小结

Content Modes        每一个视图都有一个 contentMode 来控制当视图的几何形状发生变化的时候如何复用它的内容,当view第一次被显示出来,它会将自己的内容渲染被位图持有。在那之后,改变view的几何结构将并不能导致位图被重新创建(绘制)。但是属性值ContentMode决定了bitmap是否缩放、位置在哪儿(固定在左边、右边、上面、下面、居中)。默认

欢迎来到Jack的程序世界 1万+

UIImageView的contentMode

一,写在前面     项目开发中,有时我们需要对UIImageView的contentModel属性做设置,来让图片以不同的方式,显示在UIImageView中. 比如让图片适应,UIImageView; 让UIImageView适应图片来显示等等. 二,了解contentMode @property(nonatomic) UIViewContentMode contentMode;

LXL_815520的博客 3851

UIView的contentMode

UIViewContentModeScaleToFill 根据视图的比例去拉伸图片内容。 UIViewContentModeScaleAspectFit 保持图片内容的纵横比例,来适应视图的大小。 UIViewContentModeScaleAspectFill 用图片内容来填充视图的大小,多余得部分可以被修剪掉来填充整个视图边界。 UIViewContentModeRed...

u012717715的博客 2296

UIViewContentMode 图片显示模式

UIViewContentMode各类型效果 UIViewContentMode typedef enum {     UIViewContentModeScaleToFill,     UIViewContentModeScaleAspectFit,      // contents scaled to fit with fixed aspect. remainder

u012338816的专栏 602

UIView 简介(三)contentMode属性 (内容模式)

视图的内容模式控制着视图如何回收内容来响应视图几何结构的变化,也控制着是否需要回收内容。 当一个视图第一次显示时,它通常会解释内容,其结果会被底层的层级树捕获为一张位图。 在那之后,改变视图的几何结构不会导致重新创建位图。相反,视图中contentMode属性的值决定着这张位图是否该被拉伸, 以适应新的边界或者只是简单的被放到角落或者视图的边界。   视图的内容模式在你进

学习笔记 773

UIViewContentMode的各种效果

UIViewContentMode的各种效果: 首先它是枚举类型的数据,表示为下所示: typedef enum { UIViewContentModeScaleToFill, // default valueUIViewContentModeScaleAspectFit,// contents scaled to fit with ...

weixin_30635053的博客 116

UIViewContentMode的用法

typedef enum {      UIViewContentModeScaleToFill,     UIViewContentModeScaleAspectFit,      // contents scaled to fit with fixed aspect. remainder is transparent     UIViewContentModeScaleAspect

iOS开发笔记 3871

UIView的图像填充模式

UIViewContentModeScaleToFill,      // 拉伸自适应填满整个视图     UIViewContentModeScaleAspectFit,   // 自适应比例大小显示     UIViewContentModeScaleAspectFill,  // 原始大小显示     UIViewContentModeRedraw,           /

zhao15127334470的博客 731

iOS开发进阶(十二):UIImage 载入图像

仅载入图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就能够用该方法,减少内存消耗。用这样的方式会消耗非常大的内存。载入图像也有自己的优势。对于同一个图像系统仅仅会把它。类方法加载的图片,只能获取ipa包路径下的图片资源。到内存一次,这对于图像的反复利用是非常有优势的。载入图像的方法非常多。中且也能加载ipa包路径下的图片资源。类方法加载的图片,通常放置在。类方法创建图片对象。

IT全栈 华强工作室 815
上一篇: [IOS]今天开始学UI---UIImageView
下一篇: [IOS]今天开始学UI---UIPageControl
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值