您的位置:首页 > 产品设计 > UI/UE

ios UIKit框架分析 第7天

2014-05-18 11:02 477 查看
1.UIToolBar

-> UI_APPEARANCE_SELECTOR 宏 设置控件全局显示样式appearance
proxy,

appearance是apple在iOS5.0上加的一个协议,它让程序员可以很轻松地改变某控件的全局样式(背景)

 @selector(appearance)

支持UIAppearance协议的类可以访问appearance selector ,它为receiver返回appearance proxy,我么可以给proxy发一些消息,诸如setTintColor:等
@property(nonatomic,retain) UIColor *barTintColor NS_AVAILABLE_IOS(7_0)UI_APPEARANCE_SELECTOR; //
default is nil
程序中所有的barTintColors都会发生改变,该属性的设置是全局有效的。
barTintColor 是iOS7中的新特性,只改变toobar的背景颜色,

tintColor 则是改变toolBar上面的item(或标题)的颜色。

UIToolbar * toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 40, 320, 40)];
[toolBar setItems:items];
[toolBar setTintColor:[UIColor redColor]];
[toolBar setBarTintColor:[UIColor blueColor]];




在ios6中 @property(nonatomic,retain)UIColor *tintColor;设置背景颜色



2.UIView

1. 首先,



函数是什么关系?

2. 具体到某个例子,UITableView是UIScrollView的子类,那么我们点击一个UITableViewCell的时候,我们是准备上下移动table 还是说要select这个table呢?

3. 如果一个UIScrollView覆盖住一个UIButton,那么我要调用点击那个UIButton 怎么办?

对于第一个问题,hitTest:函数就是判断当前你的手指触摸是不是在当前视图中。如何判断呢? 这里有一大堆话,我是从网上弄下来的,不爱看就直接看下面的图

也就是这个意思:

你的继承图表是这样的,然后你的手指放在D视图上,

那么 ,视图A调用(继承图表最上面的)

然后每个视图都会调用

A return YES;

B return NO;

C return YES;

D return NO;

凡是返回YES的视图中,最下面的就是了 也就是D, hitTest 视图。

然后对于第二个和第三个问题,

解决方式是这样的,你在任何superView里面重载这个函数就可以了。

原文出处 http://www.cnblogs.com/iosdev/archive/2012/12/11/2812254.html


-》UIView中的坐标转换

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;


// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
// 将像素point从view中转换到当前视图中,返回在当前视图中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;

// 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
// 将rect从view中转换到当前视图中,返回在当前视图中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;
例把UITableViewCell中的subview(btn)的frame转换到 controllerA中

// controllerA 中有一个UITableView, UITableView里有多行UITableVieCell,cell上放有一个button
// 在controllerA中实现:
CGRect rc = [cell convertRect:cell.btn.frame toView:self.view];
// 或
CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell];
// 此rc为btn在controllerA中的rect

// 或当已知btn时:
CGRect rc = [btn.superview convertRect:btn.frame toView:self.view];
// 或
CGRect rc = [self.view convertRect:btn.frame fromView:btn.superview];


-》VIew的保存与恢复 UIStateRestoration

@interface UIView (UIStateRestoration)
@property (nonatomic,copy)
NSString *restorationIdentifierNS_AVAILABLE_IOS(6_0);
- (void) encodeRestorableStateWithCoder:(NSCoder *)coderNS_AVAILABLE_IOS(6_0);
- (void) decodeRestorableStateWithCoder:(NSCoder *)coderNS_AVAILABLE_IOS(6_0);
@end
iOS设计规范中要求,当应用退出的时候(包括被终止运行时候),画面中UI元素状态需要保持的,当再次进来的时候看状态与退出是一样的。iOS6之后苹果提供以下API使得UI状态保持和恢复变得很容易了。

在iOS6中我们可以在3地方实现状态保持和恢复:应用程序委托对象 视图控制器
自定义视图

详情参考http://www.2cto.com/kf/201301/186384.html

-》UISnapshotting 屏幕快照

在iOS7 以前, 获取一个UIView的快照有以下步骤: 首先创建一个UIGraphics的图像上下文,然后将视图的layer渲染到该上下文中,从而取得一个图像,最后关闭图像上下文,并将图像显示在UIImageView中。现在我们只需要一行代码就可以完成上述步骤了:

UIView * snapShotView = [self.view snapshotViewAfterScreenUpdates:NO];


这个方法制作了一个UIView的副本,如果我们希望视图在执行动画之前保存现在的外观,以备之后使用(动画中视图可能会被子视图遮盖或者发生其他一些变化),该方法就特别方便。

afterUpdates参数表示是否在所有效果应用在视图上了以后再获取快照。例如,如果该参数为NO,则立马获取该视图现在状态的快照,反之,以下代码只能得到一个空白快照:

UIView * snapShotView = [self.view snapshotViewAfterScreenUpdates:YES];
[self.view setAlpha:0.0f];


由于我们设置afterUpdates参数为YES,而视图的透明度值被设置成了0,所以方法将在该设置应用在视图上了之后才进行快照,于是乎屏幕空空如也。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: