iOS开发——完整项目实战OC篇&百思不得姐第五天

百思不得姐第五天



上午


一:蒙板

  • tabBarController:addsubViews
  • Window:rootViewController
  • Modal:presentViewController(rootViewController)

二:显示界面不是想要的效果

由于是使用Xib所以默认在ViewDidLoad中的frame是对应Xib的frame:(600,600)

我们如果要实现布局应该在-viewDidLayoutSubViews实现

但是如果真的要在ViewDidLoad里面实现我们可以设置成屏幕的中点

总结

自定义VIew

  • ViewDidLoad添加子控件
  • LayoutSubViews实现布局

控制器中

  • viewDidLoad添加
  • viewDidLayoutSubViews布局

三:循环创建的按钮上面显示不同的文字,如果是图片的话名字一般有规律,没有规律就喝文字一样设置

  • 模型或者字典:(数据多的时候)
  • 数组,直接去索引

四:弹簧

  • 三个值
  • 苹果自带的UIView动画spring
  • POP

三个值

在三个不同的值之间跳转

苹果:核心动画

POP:(poping/LearnCube/)

//Basic animations can be used to interpolate values over a specified time period. To use an ease-in ease-out animation to animate a view‘s alpha from 0.0 to 1.0 over the default duration:

1 POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
2 anim.fromValue = @(0.0);
3 anim.toValue = @(1.0);
4 [view pop_addAnimation:anim forKey:@"fade"];

//Spring animations can be used to give objects a delightful bounce. In this example, we use a spring animation to animate a layer‘s bounds from its current value to (0, 0, 400, 400):

1 POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
2 anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)];
3 [layer pop_addAnimation:anim forKey:@"size"];

//Decay animations can be used to gradually slow an object to a halt. In this example, we decay a layer‘s positionX from it‘s current value and velocity 1000pts per second:

1 POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
2
3 anim.velocity = @(1000.);
4
5 [layer pop_addAnimation:anim forKey:@"slide"];

后面两种常见方法总结

如果你和我一样时动画迷那么你可以看看这些:


 

 

五:按钮尽管尺寸为0,但是只要有文字就会显示一个黑色的点

解决办法:

  • 设置宽度为负数
  • 按钮的x值在屏幕外

六:媒体时间的使用,虽然他本身是一个浮点类型,但是不能直接设置浮点值,这样会没有效果,所以我们应该使用,媒体时间对应的方法

七:关于switch中case注意点:C语言语法

八:空的block如果被调用就会报坏内存访问

所以就需要判断

九:dismis(销毁)控制器之后又拿到控制器来model或者push就会出现严重的bug,这个时候我们应该直接拿到window来操作

十:宏的定义后面对应的值一般加括号



下午



十一:取消ScrollView自动调整

XIb中

十二:textView显示占位文字

1:drawRect

2:使用并且设置label属性

十三:文字(字典)对应的值为空,

十四:UItextView和UITextField总结

十五:导航栏主题设置

十六:常见(刷新)方法总结

十七:判断文本框是否有文字

十八:Bounds总结

bounds的x和y事可以改的,如果是正数那就会往外面移,如果是负数就会往里面移。

  1. 等于偏移量:值相同,意义一样
  2. 类似内边距:ContentInset(取反)
  • 注:(一直都是以内容左上角为0,0)

bounds以“内容左上角”位置为参照取边框左上角的位置

如下,bounds对应的x,y分别是-20,-64

  • 在导航栏应用中有这样一个结论

当我们使用导航栏的时候,系统会从子控件中取出第一个,判断如果是scrollView就会下移64就是内边距(contentInset),如果不是就不会调整

但是有一个需要注意的:如果有超过一个scrollView的时候设置self.automaticallyAdjustsScrollViewInsets设置为NO,然后根据需要去调整scrollView的inset

如果没有导航栏就只会调整20的边距(状态栏的大小)

scrollView的属性总结

  • contentInset:内容的边距
  • contentSize滚动范围,内容的尺寸(可能有些我们看不见,但是任然存在)
  • frame:以父控件内容左上角为原点去矩形框的位置
  • frame:以自己内容左上角为原点去矩形框的位置
  • contentOffset:偏移量,内容左上角和矩形框左上角的差值(bounds.origin)

注意:automaticallyAdjustsScrollViewInsets:控制器的属性


晚上


使用UItextView实现占位文字(类QQ空间发布动态界面)完整封装实现。

关于实现方式上面已经说到,这里只实现绘图的方法

Objective-C

头文件的声明

1 #import <UIKit/UIKit.h>
2
3 @interface iCocosPlaceholderDrawTextView : UITextView
4 /** 占位文字 */
5 @property (nonatomic, copy) NSString *placeholder;
6 /** 占位文字颜色 */
7 @property (nonatomic, strong) UIColor *placeholderColor;
8 @end

实现文件

 1 #import "iCocosPlaceholderDrawTextView.h"
 2
 3 @implementation iCocosPlaceholderDrawTextView
 4
 5 - (instancetype)initWithFrame:(CGRect)frame
 6 {
 7     if (self = [super initWithFrame:frame]) {
 8         // 设置默认字体
 9         self.font = [UIFont systemFontOfSize:15];
10
11         // 设置默认颜色
12         self.placeholderColor = [UIColor grayColor];
13
14         [self becomeFirstResponder];
15
16         // 使用通知监听文字改变
17         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextViewTextDidChangeNotification object:self];
18     }
19     return self;
20 }
21
22 - (void)textDidChange:(NSNotification *)note
23 {
24     // 会重新调用drawRect:方法
25     [self setNeedsDisplay];
26 }
27
28 - (void)dealloc
29 {
30     [[NSNotificationCenter defaultCenter] removeObserver:self];
31 }
32
33 /**
34  * 每次调用drawRect:方法,都会将以前画的东西清除掉
35  */
36 - (void)drawRect:(CGRect)rect
37 {
38     // 如果有文字,就直接返回,不需要画占位文字
39 //    if (self.text.length || self.attributedText.length) return;
40     if (self.hasText) return;
41
42     // 属性
43     NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
44     attrs[NSFontAttributeName] = self.font;
45     attrs[NSForegroundColorAttributeName] = self.placeholderColor;
46
47     // 画文字
48     rect.origin.x = 5;
49     rect.origin.y = 8;
50     rect.size.width -= 2 * rect.origin.x;
51     [self.placeholder drawInRect:rect withAttributes:attrs];
52 }
53
54 - (void)layoutSubviews
55 {
56     [super layoutSubviews];
57
58     [self setNeedsDisplay];
59 }
60
61 #pragma mark - setter
62 - (void)setPlaceholder:(NSString *)placeholder
63 {
64     _placeholder = [placeholder copy];
65
66     [self setNeedsDisplay];
67 }
68
69 - (void)setPlaceholderColor:(UIColor *)placeholderColor
70 {
71     _placeholderColor = placeholderColor;
72
73     [self setNeedsDisplay];
74 }
75
76 - (void)setFont:(UIFont *)font
77 {
78     [super setFont:font];
79
80     [self setNeedsDisplay];
81 }
82
83 - (void)setText:(NSString *)text
84 {
85     [super setText:text];
86
87     [self setNeedsDisplay];
88 }
89
90 - (void)setAttributedText:(NSAttributedString *)attributedText
91 {
92     [super setAttributedText:attributedText];
93
94     [self setNeedsDisplay];
95 }

Swift实现

 1 import UIKit
 2
 3 class iCocosPlaceholderDrawTextView: UITextView {
 4
 5     var placeholder: String? {
 6         didSet {
 7             self.placeholderLabel.text = placeholder
 8             self.placeholderLabel.sizeToFit()
 9         }
10     }
11     var placeholderColor: UIColor? {
12         didSet {
13             self.placeholderLabel.textColor = placeholderColor
14         }
15     }
16
17     var placeholderLabel: UILabel = UILabel()
18
19
20     override init(frame: CGRect, textContainer: NSTextContainer?) {
21         super.init(frame: CGRect(), textContainer: NSTextContainer?())
22
23         placeholderLabel.numberOfLines = 0
24         self.addSubview(placeholderLabel)
25
26         self.font = UIFont.systemFontOfSize(15)
27
28         self.placeholderColor = UIColor.grayColor()
29
30         NSNotificationCenter.defaultCenter().addObserver(self, selector: "textDidChange", name: UITextViewTextDidChangeNotification, object: self)
31     }
32
33
34
35     required init(coder aDecoder: NSCoder) {
36         fatalError("init(coder:) has not been implemented")
37     }
38
39     func textDidChange() {
40         self.placeholderLabel.hidden = self.hasText()
41     }
42
43     deinit {
44         NSNotificationCenter.defaultCenter().removeObserver(self)
45     }
46
47     override func layoutSubviews() {
48         super.layoutSubviews()
49
50         self.placeholderLabel.frame.origin.x = 5
51         self.placeholderLabel.frame.origin.y = 8
52         self.placeholderLabel.frame.size.width = self.frame.size.width - 2 * self.placeholderLabel.frame.origin.x
53
54         self.placeholderLabel.sizeToFit()
55     }
56
57
58 //    - (void)setFont:(UIFont *)font
59 //    {
60 //    [super setFont:font];
61 //
62 //    self.placeholderLabel.font = font;
63 //    [self.placeholderLabel sizeToFit];
64 //    //    [self setNeedsLayout];
65 //    }
66 //
67 //    - (void)setText:(NSString *)text
68 //    {
69 //    [super setText:text];
70 //
71 //    self.placeholderLabel.hidden = self.hasText;
72 //    }
73 //
74 //    - (void)setAttributedText:(NSAttributedString *)attributedText
75 //    {
76 //    [super setAttributedText:attributedText];
77 //
78 //    self.placeholderLabel.hidden = self.hasText;
79 //    }
80
81 }

时间: 2024-10-12 23:30:14

iOS开发——完整项目实战OC篇&百思不得姐第五天的相关文章

iOS开发——完整项目实战OC篇&amp;百思不得姐第四天

iOS开发——完整项目实战OC篇&百思不得姐第四天 上午 一:自定义按钮使用九宫格布局 二:控件不能点击 三:获取用户点击了那个按钮 四:调整按钮内部控件的位置:主流->上下 五:不能直接使用self.navigationController中或者View中获取导航控制器 方法一: 方法二: 六:布局取整 1 // 总行数 2 3 // NSUInteger rows = sqaures.count / maxCols; 4 5 // if (sqaures.count % maxCols)

iOS开发——完整项目实战OC篇&amp;百思不得姐第十一天

百思不得姐第十一天 一:模型中没有ID这个属性 为模型增加一个属性ID,设置名字替换 /** id */ @property (nonatomic, copy) NSString *ID; 替换: + (NSDictionary *)replacedKeyFromPropertyName {     return @{@"ID" : @"id"}; } 二:错误的将数组当作字典来用(其实就是没有数据,比如刷新数据已经没有了,或者直接就是0) 通过堆栈定位错误 最后一

iOS开发——完整项目实战OC篇&amp;百思不得姐第一天

百思不得姐第一天 做好准备,我们要开干了...... 先声明,我不过给出过多的代码实现,除非是一些重要的(开发中常用的),或者是比较难理解的. 主要介绍一些思路和简单功能的总结,还有一些遇到的错误及处理! 上午 一:修改项目名称(之前是Buble DisplayName) 二:删除(没有launchXIB的时候会显示界面错误),再iOS8以后屏幕的显示跟启动图片有关 需要删除对应,并且设置launchImages 或者我们可以自己在images.xcasesets中新建我们的launchImag

iOS开发——完整项目实战OC篇&amp;百思不得姐第八天

百思不得姐第八天 上午 一:监听ScrollView停止两种方法 代码实现滚动的时候:必须要有动画 拖拽实现滚动的时候 二:ScrollView中,对应的X/Y宽高都相等的时候frmae就等一bounds 三:判断View是否在对应的View上面 1:判断父控件 2:看Window是否有值 3:是否创建加载 四:autormaticllyAdjustScrollViewInsets 五:内边距设置 1:tableView尺寸还是屏幕的尺寸(高度) 2:不被导航栏河tabBar挡住(用户能看齐所有

iOS开发——完整项目实战OC篇&amp;百思不得姐第三天

百思不得姐第三天 上午 错误:键盘处理 设置cell的分割线 方法一:添加一个View再上面 方法二:修改对应的Frame 拦截系统frame的设置,根据需求修改对应的值 不管别人传什么进来原值都不变,使用我们默认的值 优化 控制器挂掉取消 AFN内部实现 直接终止请求 暂停请求 取消请求总结 AFN返回码 debug不能全为小写 两者不同,下面的带IBOutlet的内部会隐士的强引用着他 所以调用方式是先打印后面的,就是说走完第一行之后并且没有销毁,等}走完之后就销毁 下午 设置圆形图片的简单

iOS开发——完整项目实战OC篇&amp;百思不得姐第二天

百思不得姐第二天 上午 一调用父类先后顺序问题 二:手势滑动 解决问题 1 // 什么时候调用:每次触发手势之前都会询问下代理,是否触发. 2 // 作用:拦截手势触发 3 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 4 { 5 // 注意:只有非根控制器才有滑动返回功能,根控制器没有. 6 // 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器 7 if (s

iOS开发——完整项目实战OC篇&amp;百思不得姐第十天

百思不得姐第十天 一:设置时间的显示 显示如下 二:MJExtension类型(名字)的指定——映射 1.在模型实中 2.字典转模型中 三:常见问题 问题1:多个对一个 有时候可能会有多个属性对应一个名字的时候我们就需要使用的到数组 问题2:子模型中的名字 问题3:返回复杂的数据(比如在一个字典里面还有一个字典再在里面有一个url数组) 统一处理 四:模型中嵌套模型:数组中存放模型(模型里面有数组数组里面又装着模型) 或者在代理或在一个独立的文件中的load方法中 五:没有注释 没有参与编译 @

iOS开发——完整项目实战OC篇&amp;百思不得姐第六天

百思不得姐第六天 上午 一:使用Xib加载View 一般我们直接在分类里面,因为Xib加载的代码都是一样 二:键盘的两个常见属性 inoutAccessoryView inputView 三:切换系统和自定义键盘的简单使用方式,是不是很变态 根据使用的键盘判断类型并且切换 四:使用动画的方式,其实就是设置切换的时间就可以了 五:特殊需求,直接总定义并且添加View(不使用inoutAccessoryView) 使用通知实现工具条跟着键盘的移动:(上移键盘的高度) 1:改变Y值,上下改变Y值->使

iOS开发——完整项目实战OC篇&amp;百思不得姐第七天

百思不得姐第七天 上午 一:传值方式 谁传值(主动方):谁发通知. 谁传值(主动方):创建Blcok(判断). 谁传值(主动方):创建协议,代理方法. 详细请看: http://www.cnblogs.com/iCocos/p/4659878.html http://www.cnblogs.com/iCocos/p/4550169.html 二:按钮中的文字获取 方法一: 方法二: 将数组的所有path对应的属性取出来,放到一个数组厘面去 三:装逼试判断:三木运算 四:数组不能一边遍历一边删除