若是想調用某個類的某個方法能夠寫成這樣,這個方法來自NSObject類windows
performSelector: app
performSelector:withObject: 框架
performSelector:withObject:withObject: 動畫
實際調用url
[self performSelector:@selector(displayViews) withObject:nil afterDelay:1.0f]; spa
有三個方法分別是代理
//父視圖 orm
[self.view superview] blog
//全部子視圖 索引
[self.view subviews]
//自身的window
self.view.window
循環一個視圖下面全部視圖的方法
NSArray *allSubviews(UIView *aView)
{
NSArray *results = [aView subviews];
for (UIView *eachView in [aView subviews])
{
NSArray *riz = allSubviews(eachView);
if (riz) {
results = [results arrayByAddingObjectsFromArray:riz];
}
}
return results;
}
循環返回一個APPLICATION裏面全部的VIEW
// Return all views throughout the application
NSArray *allApplicationViews()
{
NSArray *results = [[UIApplication sharedApplication] windows];
for (UIWindow *window in [[UIApplication sharedApplication] windows])
{
NSArray *riz = allSubviews(window);
if (riz) results = [results arrayByAddingObjectsFromArray: riz];
}
return results;
}
找出全部的父視圖
// Return an array of parent views from the window down to the view
NSArray *pathToView(UIView *aView)
{
NSMutableArray *array = [NSMutableArray arrayWithObject:aView];
UIView *view = aView;
UIWindow *window = aView.window;
while (view != window)
{
view = [view superview];
[array insertObject:view atIndex:0];
}
return array;
}
UIView提供了大量管理視圖的方法
//加一個視圖到一個視圖裏面
addSubview:
//將一個視圖移到前面
bringSubviewToFront:
//將一個視圖推送到背後
sendSubviewToBack:
//把視圖移除
removeFromSuperview
//插入視圖 並指定索引
insertSubview:atIndex:
//插入視圖在某個視圖之上
insertSubview:aboveSubview:
//插入視圖在某個視圖之下
insertSubview:belowSubview:
//交換兩個位置索引的視圖
exchangeSubviewAtIndex:withSubviewAtIndex:
視圖回調
//當加入視圖完成後調用
(void)didAddSubview:(UIView *)subview
//當視圖移動完成後調用
(void)didMoveToSuperview
//當視圖移動到新的WINDOW後調用
(void)didMoveToWindow
//在刪除視圖以後調用
(void)willRemoveSubview:(UIView *)subview
//當移動視圖以前調用
(void)didMoveToSuperview:(UIView *)subview
//當視圖移動到WINDOW以前調用
(void)didMoveToWindow
給UIView設置標記和檢索視圖
myview.tag = 1001;
[self.view viewWithTag:1001];
(UILable *)[self.view.window viewWithTag:1001];
視圖的幾何特徵
//框架
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
/* Sizes. */
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
CGRect rect = CGRectMake(0,0,320,480);
UIView *view = [[UIView allow]initWithFrame:rect];
//將String轉成CGPoint 如 @」{3.0,2.5}」 {x,y}
CGPoint CGPointFromString (
NSString *string
);
//將String轉成CGRect @」{{3,2},{4,5}}」 {{x,y},{w, h}}
CGRect CGRectFromString (
NSString *string
);
//將String轉成CGSize @」{3.0,2.5}」 {w, h}
CGSize CGSizeFromString (
NSString *string
);
//CGPoint轉成NSString
NSString * NSStringFromCGPoint (
CGPoint point
);
//CGRect轉成NSString
NSString * NSStringFromCGRect (
CGRect rect
);
//CGSize轉成NSString
NSString * NSStringFromCGSize (
CGSize size
);
//對一個CGRect進行修改 以這個的中心來修改 正數表示更小(縮小) 負數表示更大(放大)
CGRect CGRectInset (
CGRect rect,
CGFloat dx,
CGFloat dy
);
//判斷兩個矩形是否相交
bool CGRectIntersectsRect (
CGRect rect1,
CGRect rect2
);
//初始爲0的
const CGPoint CGPointZero;
const CGRect CGRectZero;
const CGSize CGSizeZero;
//建立CGPoint
CGPoint CGPointMake (
CGFloat x,
CGFloat y
);
//建立CGRect
CGRect CGRectMake (
CGFloat x,
CGFloat y,
CGFloat width,
CGFloat height
);
//建立CGSize
CGSize CGSizeMake (
CGFloat width,
CGFloat height
);
仿射變換
CGAffineTransform form = CGAffineTransformMakeRotation(PI);
myview.transform = form;
如想復原
myview.transform = CGAffineTransformIdentity;
直接設置視圖的中心
myview.center = CGPointMake(100,200);
中心
CGRectGetMinX
CGRectGetMinY
//X的中間值
CGRectGetMidX
//Y的中間值
CGRectGetMidY
CGRectGetMaxX
CGRectGetMaxY
定時器
NSTime *timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(move:) userInfo:nil repeats:YES];
定義視圖邊界
typedef struct UIEdgeInsets {
CGFloat top, left, bottom, right; // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
} UIEdgeInsets;
//eg
UIEdgeInsets insets = UIEdgeInsetsMake(5, 5, 5, 5);
CGRect innerRect = UIEdgeInsetsInsetRect([aView bounds], insets);
CGRect subRect = CGRectInset(innerRect, self.frame.size.width / 2.0f, self.frame.size.height / 2.0f);
仿射變換補充
//建立CGAffineTransform
//angle 在0-2*PI之間比較好 旋轉
CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
//縮放
CGAffineTransform transform = CGAffineTransformMakeScale(0.5f,0.5f);
//改變位置的
CGAffineTransform transform = CGAffineTransformMakeTranslation(50,60);
//修改CGAffineTransform
//修改 縮放
CGAffineTransform scaled = CGAffineTransformScale(transform, degree, degree);
//修改 位置
CGAffineTransform transform = CGAffineTransformTranslate(
CGAffineTransform t,
CGFloat tx,
CGFloat ty
);
//修改角度
CGAffineTransform transform = CGAffineTransformRotate (
CGAffineTransform t,
CGFloat angle
);
//最後設置到VIEW
[self.view setTransform:scaled];
創建UIView動畫塊
//首先創建CGContextRef
CGContextRef context = UIGraphicsGetCurrentContext();
//標記動畫開始
[UIView beginAnimations:nil context:context];
//定義動畫加速或減速的方式
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//定義動畫的時長 1秒
[UIView setAnimationDuration:1.0];
//中間處理 位置變化,大小變化,旋轉,等等的
[[self.view viewWithTag:999] setAlpha:1.0f];
//標誌動畫塊結束
[UIView commitAnimations];
//還能夠設置回調
[UIView setAnimationDelegate:self];
//設置回調調用的方法
[UIView setAnimationDidStopSelector:@selector(animationFinished:)];
視圖翻轉
UIView *whiteBackdrop = [self.view viewWithTag:100];
// Choose left or right flip 選擇左或右翻轉
if ([(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex]){
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:whiteBackdrop cache:YES];
}else{
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:whiteBackdrop cache:YES];
}
NSInteger purple = [[whiteBackdrop subviews] indexOfObject:[whiteBackdrop viewWithTag:999]];
NSInteger maroon = [[whiteBackdrop subviews] indexOfObject:[whiteBackdrop viewWithTag:998]];
//交換視圖
[whiteBackdrop exchangeSubviewAtIndex:purple withSubviewAtIndex:maroon];
//還有上翻和下翻兩種 以下
typedef enum {
//沒有任何效果
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
} UIViewAnimationTransition;
使用QuartzCore作動畫
//建立CATransition
CATransition *animation = [CATransition animation];
//設置代理
animation.delegate = self;
//設置動畫過渡的時間
animation.duration = 4.0f;
//定義動畫加速或減速的方式
animation.timingFunction = UIViewAnimationCurveEaseInOut;
//animation.type 表示設置過渡的種類 如 Fade,MoveIn,Push,Reveal
switch ([(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex]) {
case 0:
animation.type = kCATransitionFade;
break;
case 1:
animation.type = kCATransitionMoveIn;
break;
case 2:
animation.type = kCATransitionPush;
break;
case 3:
animation.type = kCATransitionReveal;
default:
break;
}
//設置漸變的方向,上下左右
if (isLeft)
animation.subtype = kCATransitionFromRight;
else
animation.subtype = kCATransitionFromLeft;
// Perform the animation
UIView *whitebg = [self.view viewWithTag:10];
NSInteger purple = [[whitebg subviews] indexOfObject:[whitebg viewWithTag:99]];
NSInteger white = [[whitebg subviews] indexOfObject:[whitebg viewWithTag:100]];
[whitebg exchangeSubviewAtIndex:purple withSubviewAtIndex:white];
[[whitebg layer] addAnimation:animation forKey:@"animation"];
animation.type還能夠用如下的賦值
switch (theButton.tag) {
case 0:
animation.type = @"cube";
break;
case 1:
animation.type = @"suckEffect";
break;
case 2:
animation.type = @"oglFlip";
break;
case 3:
animation.type = @"rippleEffect";
break;
case 4:
animation.type = @"pageCurl";
break;
case 5:
animation.type = @"pageUnCurl";
break;
case 6:
animation.type = @"cameraIrisHollowOpen ";
break;
case 7:
animation.type = @"cameraIrisHollowClose ";
break;
default:
break;
}
上面這個是轉自這裏的http://2015.iteye.com/blog/1122130
休眠一下
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0f]];
一個簡單的經過圖片作的動畫
// Load butterfly images
NSMutableArray *bflies = [NSMutableArray array];
for (int i = 1; i <= 17; i++){
[bflies addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"bf_%d", i] ofType:@"png"]]];
}
UIImageView *butterflyView = [[UIImageView alloc] initWithFrame:CGRectMake(40.0f, 300.0f, 60.0f, 60.0f)];
butterflyView.tag = 300;
//設置動畫的圖片
butterflyView.animationImages = bflies;
//設置時間
butterflyView.animationDuration = 0.75f;
[self.view addSubview:butterflyView];
//開始動畫
[butterflyView startAnimating];
[butterflyView release];