热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【ObjectiveC学习记录】第六天

今天学习了UI部分的内容,有点多,好好整理下。首先是UIWindow。直接实例化UIView:UIView*view[[UIViewalloc]init];然后对其进行大小设置:v

今天学习了UI部分的内容,有点多,好好整理下。

首先是UIWindow。

直接实例化UIView:UIView *view = [[UIView alloc] init];

然后对其进行大小设置:view.frame = CGRectMake(10,30,355,627);学过HTML或者界面方面的都了解这个Rect,顾名思义就是一个矩形Rect(x,y,width,height)。x表示矩形的横坐标,y表示矩形的纵坐标,width表示矩形的宽,height表示矩形的高,有了这四个参数,我们就能在iPhone上确定一块窗口了。我们在生活中坐标轴一般是左下角开始,向右x轴递增,向上y轴递增,而计算机屏幕是从左上角开始计算的,即向右x轴递增,向下y轴递增。在这里这块矩形的大小,在iPhone6上距离屏幕边缘四周10px,至于y轴方向为什么偏移30px,是因为iOS的通知栏占了20px,并且通知栏的优先级非常高。

现在我们在模拟器上还是看不到任何东西,是因为我们只实例化了这个窗口,还没有设置它的颜色:view.backgroundColor = [UIColor yellowColor];

最后将这个窗口添加为整个窗体的子类即可:[self.view addSubView:view];

技术分享

接下来是一些需要记忆的属性/参数:

  frame

  view.frame.origin.x - view距离屏幕x的偏移,上图为10px

  view.frame.origin.y - view距离屏幕y的偏移,上图为30px

  view.frame.size.width - view的宽

  view.frame.size.height - view的高

  bounds

  (view.bounds.origin.x, view.bounds.origin.y, view.bounds.size.width, view.bounds.size.height)

  bounds表示view边框的大小,其x和y始终为0,width、height与frame的相等,在某种程度上frame可以代替bounds使用。

  center

  (view.center.x,view.center.y) - 屏幕中心点

  获取屏幕分辨率UIScreen:

  [[UIScreen mainScreen]bounds].size.width

  [[UIScreen mainScreen]bounds].size.height

窗体也有子父的概念,子视图会被嵌套在父视图中,类似于HTML里的

,其中一个子视图的父视图只能有一个,子视图可以有多个。视图的层级关系具体总结为:1.在同一个父视图中时,先加入的view会被覆盖在下面;2.子视图根据父视图进行遮挡,如果父视图层级低于其他同级视图,那么该父视图的子视图也会被遮挡。

首先是给一个视图指定它的父视图:UIView *superView = view.superView; 

或者通过另一种方式为父视图添加它的子视图:[superView addSubView:view2];[superView addSubView:view3];

接着我们可以对该父视图进行遍历,这里使用枚举遍历:

  NSArray *subViewsArray = superView.subViews;

  for(UIView *view in subViewsArray)

    //TODO

另外可以给视图设置标签,这样我们就可以通过标签来查找这个视图,这个tag跟Unity里的tag有点类似:view.tag = 1;根据tag获取视图:UIView *view = [superView viewWithTag:1];

交换视图。

规则:1.交换两个层的视图时,必须填写正确的层数;2.交换两个层后,对应的子视图的数组下标也会改变。

[superView exchangeSubViewAtIndex:0 withSubViewAtIndex:1];如果层级不存在,交换是无效的。

插入视图到指定的层:

[superView insertSubView:view belowSubview:view2];

将一个视图放入最高层/最底层

[superView bringSubViewToFront:view];

[superView sendSubViewToBack:view];

接下来是自适应的内容:

  首先要设置准许视图自适应:view.autoresizesSubViews = YES;

  接着就可以设置自适应的方式:view.autoresizingMask = UIViewAutoresizingFlexibleWidth;这里有几个选项:UIViewAutoresizingFlexibleHeight不一一列举,简单来说就是左右上下宽高的自适应。

其次是UILabel。

label与view类似,首先实例化:UILabel *label = [[UILabel alloc] init];

设置大小:label.fram = CGRectMake(10,100,350,300);

设置颜色:label.backgroundColor = [UIColor blueColor];

设置内容:label.text = @"Hello iOS";

布局模式:label.textAlignment = NSTextAlignmentCenter;

文字颜色(两种方式):1.label.textColor = [UIColor greenColor];其中有一个特殊的clearColor表示透明色

           2.label.textColor = [UIColor colorWithRed:0.1 green:0.8 blue:0.2 alpha:1];即通过RPGA来设置颜色

字体设置:label.fOnt= [UIFont systemFontOfSize:25];25是字体大小

     label.fOnt= [UIFont boldSystemFontOfSize:25];

     label.fOnt= [UIFont italicsSystemFontOfSize:25];

     并且可以查看系统内所有的字体:

     for(NSString *name in [UIFont familyNames])

       NSLog(@"%@",name);

     label.fOnt= [UIFont fontWithName: @"Apple Color Emoji" size:25];

字体阴影:label.shadowColor = [UIColor redColor];

     label.shadowOffset = CGSizeMake(5,5);

换行模式:label.lineBreakMode = NSLineBreakByCharWrapping;根据字符换行

     label.numberOfLines = 10;设置显示的行数

根据字符串大小计算label大小:

     CGSize size = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(355,1000) lineBreakMode]:NSLineBreakByCharWrapping];

最后是UIImage。

这里使用读取本地图片的方式加载图片。

首先需要设置图片的路径,因为图片放在了本工程的目录下,所以我们需要先获取这个工程的路径:NSString *path = [[NSBundle mainBundle] resourcePath];

然后设置图片路径:NSString *imagePath  = [NSString stringWithFormat:@"%@/bg.png",path];

根据路径读取图片:UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];

在读取了图片后还不能显示,需要通过一个载体来加载图片,所以需要实例化一个图片对象:UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

最后设置一下大小,同时也能设置背景色:imageView.frame = CGRectMake(10,100,300,300);

                   imageView.backgroundColor = [UIColor yellowColor];

内容格式:imageView.cOntentMode= UIViewContentModeScaleToFill;//拉伸充满整个载体

     imageView.cOntentMode= UIViewContentModeScaleAspectFill;//拉伸不改变比例,充满较长的一边

     imageView.cOntentMode= UIViewContentModeScaleAspectFit;//拉伸不改变比例,充满较短的一边

播放序列帧动画

  帧动画是2D游戏里常见的一种游戏动画形式,原理就是我们小时候看到过的翻页动画,通过不断的替换显示的图片,造成视觉上的动态效果。首先准备好一组帧动画的图片,张数为count,命名为"png$.png"导入到工程目录下。

  接着用一个数组来存储这些图片:NSMutableArray *imageArray = [[NSMutableArray alloc] init];

                    for(int i = 1;i <= count;i++)

                    {

                       UIImage *image  = [UIImage imageNamed:[NSString stringWithFormat:@"png%d.png",i]];

                       [imageArray addObject:image];

                    }

  然后通过一个图片载体来播放:UIImageView *imageView = [[UIImageView alloc] init];

  设置大小:imageView.frame = CGRectMake(10,10,300,300);

  添加到父视图中:[self.view addSubView:imageView];

  同样可以设置背景颜色:imageView.backgroundColor = [UIColor yelloColor];

  接下来是比较重要的设置:1.指定要播放的序列动画图片:imageView.animatiOnImages= imageArray;

              2.设置播放的时间长度:imageView.animatiOnDuration= 3;

              3.设置播放的次数:imageView.animatiOnRepeatCount= 5;

【Objective-C学习记录】第六天


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
author-avatar
zengqingwei1220
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有