iOS开发之二:UIWindow与UIView

2024-06-13 06:38

本文主要是介绍iOS开发之二:UIWindow与UIView,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、UIWindow

UIWindow 继承自UIView,它是整个应用的容器,一般来说一个应用就只有一个UIWindow。

如果不使用storyboard 时,需要我们自己创建UIWindow。实例代码如下:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MainViewController *mainVC = [[MainViewController alloc] init];
self.window.rootViewController = mainVC;
[self.window makeKeyAndVisible];

一般用[UIScreen mainScreen].bounds获取屏幕大小,包含了状态栏的高度。

bounds 方法获取的rect 一般(x,y)为(0,0),因为是在自身的坐标系中,而frame的(x,y)一般不会为0.实例代码如下;

NSLog(@"bounds:%@",NSStringFromCGRect([UIScreen mainScreen].bounds));
NSLog(@"applicationFrame:%@",NSStringFromCGRect([UIScreen mainScreen].applicationFrame));
打印的结果:

2014-04-10 19:33:32.319 1.SimpleNavigationDemo[754:c07] bounds:{{0, 0}, {320, 480}}
2014-04-10 19:33:32.321 1.SimpleNavigationDemo[754:c07] applicationFrame:{{0, 20}, {320, 460}}
以上是直接打印的屏幕信息,

2、UIView

我们看到的大部分UI控件都是UIView的子类

而iPhone的视图坐标系是以左上角为原点的。

常用的函数:

 CGPoint point = CGPointMake(100, 20);//位置参数是x坐标,y坐标CGSize size = CGSizeMake(100, 100); //大小,参数是宽度,高度CGRect rect = CGRectMake(100, 20, 100, 100);//位置和大小,参数分别是x坐标,y坐标
frame是以父视图为起点,得出自己的位置信息。

bounds是以自身的左上角为起点,得出的位置坐标为(0,0);

center 表示视图的中心点所在的位置,设置center属性值可以直接改变视图的位置。

注意:默认情况下,子视图超出父视图部分,不会被裁剪掉,如果希望父视图裁剪掉子视图超出部分,将父视图的clipsToBounds属性设置为true即可。

附图两张:


另外官方的图片如下:


常用创建视图UI有xib和代码创建两种方式,

    //通过xib的方式来创建视图对象NSBundle *bundle = [NSBundle mainBundle];NSArray *arr = [bundle loadNibNamed:@"myView" owner:self options:nil];UIView *myView = [arr objectAtIndex:0];//通过代码创建CGRect viewRect = CGRectMake(0, 0, 100, 100);UIView  *view = [[UIView alloc] initWithFrame:viewRect];

视图的常用方法:

    - (void)removeFromSuperview; //把视图从父视图移除,会做一次release操作,引用计数会减1.- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;//将视图插入到指定的索引位置- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2; //把两个索引对应的视图调换位置- (void)addSubview:(UIView *)view; //添加子视图,做一次retain操作,引用计数会加1,- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;//将视图插入到某个视图的下面- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;//将视图插入到某个视图的上面- (void)bringSubviewToFront:(UIView *)view;//将某个视图移动到最顶层- (void)sendSubviewToBack:(UIView *)view;//将某个视图移动到最底层
查找某个视图,我们可以利用它的tag属性,所以多个控件的时候,tag属性要设置的不一致,否则可能会查出多个视图,默认tag为0。

    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];myView.tag  = 100;[self.view addSubview:myView];//在其他方法中用tag值查找View,在自定义cell时常用到UIView *findView = [self.view viewWithTag:100];
视图的常用属性:

    @property(nonatomic) CGRect            frame; //视图的frame@property(nonatomic) CGRect            bounds; // default bounds is zero origin, frame size. animatable@property(nonatomic) CGPoint           center;      // center is center of frame. animatable@property(nonatomic) CGAffineTransform transform;   // 默认是 CGAffineTransformIdentity. animatable@property(nonatomic,readonly) UIView       *superview; //父视图@property(nonatomic,readonly,copy) NSArray *subviews;  //子视图数组@property(nonatomic,readonly) UIWindow     *window;  //所在的window@property(nonatomic)                 BOOL              clipsToBounds;              // 是否裁剪子视图超出部分,默认为NO.@property(nonatomic,copy)            UIColor          *backgroundColor;            // 背景颜色,默认为nil@property(nonatomic)                 CGFloat           alpha;                      // 透明度,可作为动画属性,默认为1.0.范围(0--1.0)@property(nonatomic,getter=isHidden) BOOL              hidden;                     //是否隐藏,默认为NO. doesn't check superviews@property(nonatomic)                 UIViewContentMode contentMode;                // default is UIViewContentModeScaleToFill
简单的视图动画:

CGAffineTransformScale    对视图比例缩放

CGAffineTransformRotate  对视图做变焦旋转

CGAffineTransformTranslate  对视图做平移操作

具体用法的示例代码如下:

    //仿射变换CGAffineTransform transform = baseView.transform;baseView.transform = CGAffineTransformScale(transform, 0.5, 0.5);baseView.transform = CGAffineTransformRotate(transform, 0.33);baseView.transform = CGAffineTransformTranslate(transform, 100, 100);





这篇关于iOS开发之二:UIWindow与UIView的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056554

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块