IOS-UI总结

1、程序启动后的开始动画

程序启动后可以加载一个简单的动画界面来介绍程序或者用户信息。

可以使用一个xib来描述界面。并且如果想在程序加载完成后第一个加载这个xib文件,需要在Appdelegate中手动加载这个xib

// 通过stroyboard启动,跟控制器的view并不会在程序启动完成的时候添加到窗口,属于懒加载范畴

// 程序启动完成的时候调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {

// Override point for customization after application launch.

// 创建窗口

self.window = [[UIWindowalloc] initWithFrame:[UIScreenmainScreen].bounds];

// 加载storyboard

UIStoryboard *story = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];

UIViewController *vc = [story instantiateInitialViewController];

self.window.rootViewController = vc;

// 显示窗口

[self.windowmakeKeyAndVisible];

// 加载欢迎界面

WelcomView *welcome = [WelcomView welcomView];

// 设置位置和尺寸

welcome.frame = self.window.bounds;

// 插入到最外层

[self.window addSubview:welcome];

returnYES;

}

在xib中如果想给内部子控件添加动画,并且动画和主界面的出现有延迟,需要在以下某个方法中实现。

// 视图添加到窗口时会调用方法didMoveToWindow 再调用didMoveToSuperview

- (void)didMoveToWindow

{

NSLog(@"%s",__func__);

}

// 视图添加到窗口时会调用这个方法

// 将后续控件的动画写道这个方法中

- (void)didMoveToSuperview

{

NSLog(@"%s",__func__);

}

回到顶部

2、LaunchScreen.xib

这个系统自动生成的xib 文件在应用启动时会自动加载,可以在里面添加一些控件,但是

注意:LaunchScreen比LaunchImage优先级高。

设置LaunchImage需要注意,默认模拟器的尺寸跟启动图片有关系。

// 加载类的时候调用

// 当程序一启动的时候就会调用

+ (void)load

{

NSLog(@"%s",__func__);

}

// 当前类或者他的子类第一次使用的时候才会调用

+ (void)initialize

{

NSLog(@"%s",__func__);

}

回到顶部

3、给插件添加自定义的提醒方式

自定义的分类,想让这个方法弹出加载图片提醒

#import "UIImage+SLQImage.h"

@implementation UIImage (SLQImage)

// 按照原始图片渲染照片,默认导航条渲染位蓝色

+ (instancetype)imageWithOriImage:(NSString *)imageName

{

UIImage *image = [UIImage imageNamed:imageName];

return [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

}

@end

把这个方法添加到插件中再次编译运行就可。

打开插件工程,找到配置文件,是一个plist文件,然后添加需要的条目。

回到顶部

4、给分类添加属性的话,只会生成set和get方法

#import <UIKit/UIKit.h>

@interface UIView (SLQFrame)

// 分类里面不能生成成员属性

// 会自动生成get,set方法和成员属性

// @property如果在分类里面只会生成get,set方法的声明,并不会生成成员属性。

@property (nonatomic, assign) CGFloat height;

@property (nonatomic, assign) CGFloat width;

@property (nonatomic, assign) CGFloat x;

@property (nonatomic, assign) CGFloat y;

@end

回到顶部

5、如何抛出异常

NSInteger count = items.count; // 按钮个数

// 判断列数是不是3的倍数,如果不是就抛出异常

if(count % 3)

{

// 跑出异常

NSException *excep = [NSException exceptionWithName:@"列数有误" reason:@"列数不是3的倍数" userInfo:nil];

[excep raise];// 抛出异常

}

// 运行结果

//  *** Terminating app due to uncaught exception ‘列数有误‘, reason: ‘列数不是3的倍数‘

回到顶部

6、自定义tabBar

默认barBar显示的图片高度不能超过44,如果大于44显示出问题,这是可以自定义tabBar。

6.1、新建一个类SLQTabBar,因为tabBar的个数不确定,所以需要外界传入,这里使用模型数组来设置。

//  模仿下UITabBar

// UITabBar里面的按钮由UITabBarController的子控制器

@interface SLQTabBar : UIView

// 模型数组(UITabBarItem),直接使用系统的模型即可

@property (nonatomic, strong) NSArray *items;

@end

6.2、模型数组只需在初始化时添加一次即可,所以使用懒加载方式.

@interfaceSLQTabBar ()

@property (nonatomic, weak) SLQTabBarButton *selected; // 按钮是否选中

@end

- (void)setItems:(NSArray *)items

{

_items = items;

// UITabBarItem保存按钮上的图片,按次序添加

for (UITabBarItem * bar in items) {

// 使用自定义的button,取消高亮状态

UIButton *btn = [SLQTabBarButtonbuttonWithType:UIButtonTypeCustom];

// 设置标签

btn.tag = self.subviews.count;

// 设置背景

[btn setBackgroundImage:bar.imageforState:UIControlStateNormal];

[btn setBackgroundImage:bar.selectedImageforState:UIControlStateSelected];

// 添加按钮按下响应事件

[btn addTarget:selfaction:@selector(btnClick:) forControlEvents:UIControlEventTouchDown];

[self addSubview:btn];

if (self.subviews.count == 1) {

// 默认选中第一个

[self btnClick:btn];

}

}

}

6.3、tabBar上是一排按钮排列而成,不过没有高亮状态,只有Normal和selected状态。

这个只需要重写 UIButton 的一个方法即可。新建一个继承自UIButton的类,重写 setHighlighted 方法

#import "SLQTabBarButton.h"

@implementation SLQTabBarButton

// 取消按钮高亮状态

- (void)setHighlighted:(BOOL)highlighted

{}

@end

6. 4、每次添加过按钮之后都要对按钮进行布局

- (void)layoutSubviews

{

[superlayoutSubviews];

int count = (int)self.subviews.count;

// 按照屏幕宽度计算按钮宽度

for (int i = 0 ;  i < count;  i ++) {

CGFloat x = 0;

CGFloat y = 0;

CGFloat w = [UIScreenmainScreen].bounds.size.width / count;

CGFloat h = self.bounds.size.height;

SLQTabBarButton *btn = self.subviews[i];

x = i * w;

btn.frame = CGRectMake(x, y, w, h);

}

}

6.5、响应按钮点击的话,使用代理传递数据

定义

@classSLQTabBar;

// 添加代理,响应按钮点击

@protocol SLQTabBarDelegate <NSObject>

@optional

- (void)tabBar:(SLQTabBar *)tabBar didClickButton:(NSInteger ) index;

@end

声明

@property (nonatomic, weak) id<SLQTabBarDelegate> delegate;

使用

- (void)btnClick:(UIButton *)btn

{

// 取消选中上一个按钮

_selected.selected = NO;

// 选中当前按钮

btn.selected  = YES;

// 记录选中的按钮

_selected = btn;

// 切换控制器,添加一个代理,先判断是否有这个方法

if ([self.delegate respondsToSelector:@selector(tabBar:didClickButton:)])

{

// 发送消息到代理,通过按钮tag判断是哪一个按钮

[self.delegate tabBar:self didClickButton:btn.tag];

}

}

6.6、具体使用方法,在控制器中设置tabBar

添加自定义的tabBar到tabBar,然后将系统生成的按钮删除.

//添加自定义的tabBar到tabBar,然后将系统生成的按钮删除

- (void)setAllTabBar

{

// 移除所有子控件

//    [self.tabBar removeFromSuperview];

// 添加自定义tabBar

SLQTabBar *bar = [[SLQTabBar alloc] init];

// 传入模型数据

bar.items = self.items;

// 设置尺寸

bar.frame = self.tabBar.bounds;

// 设置代理,监听按钮点击

bar.delegate = self;

// 添加到tabBar,但是要把系统自带的按钮删除

[self.tabBar addSubview:bar];

}

移除系统按钮

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

// 删除系统自带的tabBar

for (UIView *childView in self.tabBar.subviews) {

if (![childView isKindOfClass:[SLQTabBar class]]) {

[childView removeFromSuperview];

}

}

}

监听按钮点击

- (void)tabBar:(SLQTabBar *)tabBar didClickButton:(NSInteger)index

{

//    NSLog(@"%s--%d",__func__,index);

// 切换控制器

self.selectedIndex = index;

}

回到顶部

7、手动添加pch文件都项目

pch文件中包含的东西在项目中每个文件中都可以使用。

回到顶部

8、load和initialize

// 当程序一启动的时候就会调用

+ (void)load

{

}

// 当前类或者他的子类第一次使用的时候才会调用

+ (void)initialize

{}

回到顶部

9、 给任意弹出的窗口添加遮盖

这个也比较常见,比如说弹出登陆界面时,程序其他部分都是灰色背景,且不能点击。

可以给程序添加一个灰色的View,而且要显示在所有界面之前,那么可以使用

[UIApplication sharedApplication].keyWindow;

添加到这个窗口上的窗口默认都在最前面。

自定义一个继承自UIView的类,添加两个方法即可。

// 屏幕尺寸

#define SLQScreenBounds [UIScreen mainScreen].bounds

// 主窗口

#define SLQKeyWindow [UIApplication sharedApplication].keyWindow

// 显示遮盖

+ (void)show

{

// 获取主窗口,添加一个view 到主窗口

UIView *view = [[SLQCoverView alloc] initWithFrame:SLQScreenBounds];

view.backgroundColor = [UIColorblackColor];

view.alpha = 0.4;

// 添加窗口到主窗口,显示在最上层

[SLQKeyWindow addSubview:view];

}

// 隐藏遮盖

+ (void)hide

{

// 取出子窗口移除,首先判断是不是SLQCoverView类型的view

for (UIView *childView in SLQKeyWindow.subviews) {

if ([childView isKindOfClass:self]) {

[childView removeFromSuperview];

}

}

}

回到顶部

10、loadView、viewDidLoad和viewDidUnLoad

loadView 苹果设计这个方法就是给我们自定义UIViewController的view用的

viewDidLoad 在创建过控制器的view后,向view中添加其他控件

viewDidUnLoad  系统发出内存警告时

关系

1.第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view

2.view创建完毕后会调用viewDidLoad方法进行界面元素的初始化

3.当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法

4.当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view

5.view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化

11、UINavigationBar 所生成的图片都是经过处理的view,为蓝色

原始图片

// 默认左右两遍的view都是蓝色的,所以要返回一个原始的图片

UIImage *image = [UIImageimageNamed:@"CS50_activity_image"] ;

// 设置图片的渲染方式为原始图片

image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:imagestyle:UIBarButtonItemStylePlain target:self action:@selector(activeBtnClick)];

时间: 2024-10-22 14:56:03

IOS-UI总结的相关文章

IOS Ui控件 修改位置和尺寸,代码添加控件

所有的UI控件最终都继承自UIView,UI控件的公共属性都定义在UIView中, UIView的常见属性 UIView *superview; 获得自己的父控件对象 NSArray *subviews; 获得自己的所有子控件对象 NSInteger tag; 控件的ID(标识),父控件可以通过tag来找到对应的子控件 CGAffineTransform transform; 控件的形变属性(可以设置旋转角度.比例缩放.平移等属性) CGRect frame; 控件所在矩形框在父控件中的位置和尺

【腾讯TMQ】解放程序猿(媛)的双手—iOS UI自动化测试

解放程序猿(媛)的双手-iOS UI自动化测试 前言 随着移动互联网时代的蓬勃发展,移动终端的自动化测试也在业界日益活跃,总体来看在Android平台上的自动化工具和实践比较多,但是说到iOS平台无论从自动化工具的数量还是质量上就陡降了.究其原因,无外乎是iOS系统的封闭性,加上相对Android用户的数量少,导致对这个平台系统的自动化进展缓慢,据笔者了解到的情况,很多iOS平台的测试人员还处于纯手工测试模式,自动化程度和Android平台无法相论,更别提和PC端相比了. 然而越是困难的事,越是

ios UI数据库 sqlite小型数据库的增、删、改、查、排序

#import "table.h" @implementation table // 1.创建表 每一列之间用',',如果存在就不创建 create table if not exists t_class( class_id integer primary key autoincrement, class_name varchar, person_count integer default 0) // 1.1// 删除表 drop table if exists t_person //

iOS UI框架

iOS UI 框架          启动引导页面 +  主界面 文件下载 UIFrame

iOS UI Tab开发

iOS UI Tab开发(iOS 8) tab这种样式,类似于单选,可以叫radio-style,这是一个现在主流的layout-design,它让APP内容结构清晰,开发分工逻辑明确,经典的就是微信,时钟等 综述一下: 1.UITabBarController继承UIViewController,是一个ViewController container 2.UITabBarController拥有一个(readonly)的TabBar,TabBar拥有一到多个TabBarItem 3.每一个It

IOS UI多线程 NSThread 下载并显示图片到UIImageView

效果图 @property (weak,nonatomic)IBOutletUILabel *downLabelInfo; @property (weak,nonatomic)IBOutletUIImageView *imageView; @end @implementationViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *url  [email protected]"http://d.hiphotos.b

iOS UI异步更新:dispatch_async 与 dispatch_get_global_queue 的使用方法

GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开始支持GCD. 使用GCD的一个理由就是方便.回想一下以前的多线程编程,我们会把异步调用的代码放到另外的一个函数中,并通过NSThread开启新线程来启动这段代码. 这种跳来跳去的流程对于复杂的逻辑简直就是一场灾难.更糟糕的是,调用线程时的环境对异步代码是不可见的,如果我们需要当时的临时变量的话只有

[iOS UI进阶 - 0] Quiartz2D

A.简介 1. 需要掌握的 drawRect:方法的使用 常见图形的绘制:线条.多边形.圆 绘图状态的设置:文字颜色.线宽等 图形上下文状态的保存与恢复 图形上下文栈 1.基本图形绘制* 线段(线宽.线段样式)* 矩形(空心.实心.颜色)* 三角形.梯形等形状* 椭圆\圆* 圆弧* 文字绘制* 图片绘制(pattern)* 图形上下文栈 2.练习(画人) 3.模仿UIImageView 4.自定义checkbox 5.图片裁剪 6.图片水印 7.条纹背景 8.截图     2.概念 Quartz

iOS UI控件7(UITableView)

1.表格(UITableView)与表格控制器(UITableViewController) UITableView是iOS开发中常见的UI控件,本质是一个列表(单列的表格).UITableView允许自由控制行的控件,包括在表格行中添加多个字控件.UITableView继承了UIScrollView,具有UIScrollView的功能,这个UIScrollView主要封装了UITableViewCell单元格控件,因此UITableView默认可以对单元格进行滚动.默认情况下,所有UITabl

iOS UI进阶-1.0 Quartz2D

概述 Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统.Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 代码实现 绘制线条 #import "LineView.h" @implementation LineView -(void)drawRect:(CGRect)rect { // Drawing code // 1.获得图形上下文 CGContextRef