iOS开发基础知识--碎片27
?
?iOS開發(fā)基礎(chǔ)知識--碎片271:iOS中的round/ceil/floorf
extern float ceilf(float); extern double ceil(double); extern long double ceill(long double);extern float floorf(float); extern double floor(double); extern long double floorl(longdouble);extern float roundf(float); extern double round(double); extern long double roundl(longdouble);round:如果參數(shù)是小數(shù),則求本身的四舍五入。 ceil:如果參數(shù)是小數(shù),則求最小的整數(shù)但不小于本身. floor:如果參數(shù)是小數(shù),則求最大的整數(shù)但不大于本身. Example:如何值是3.4的話,則 3.4 -- round 3.000000-- ceil 4.000000-- floor 3.00000?
2:對數(shù)組進(jìn)行轉(zhuǎn)換,把原來二個(gè)值轉(zhuǎn)化成一條的記錄(滿足左右排版布局)
NSMutableArray *mnewArray=[[NSMutableArray alloc]init];NSArray *nameArray=@[@"1",@"2",@"3",@"4",@"5",@"6"];int allCount=0;if (nameArray.count%2==1) {//說明是奇數(shù)allCount=nameArray.count;}else{allCount=nameArray.count-1;}for (int i=0; i<allCount; i++) {userModel *userM=[[userModel alloc]init];userM.leftName=nameArray[i];i++;if (i!=nameArray.count) {userM.rightName=nameArray[i];}[mnewArray addObject:userM];}?
3:APP撥打電話完又跳回到APP里,并監(jiān)聽它的狀態(tài)
#import "ViewController.h" #import <CoreTelephony/CTCall.h> #import <CoreTelephony/CTCallCenter.h>@interface ViewController ()<UIAlertViewDelegate> @property(strong,nonatomic)UIWebView *phoneCallWebView; //電話監(jiān)聽 @property (nonatomic, strong) CTCallCenter * center; @end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];}- (IBAction)sdfsdfsdfs:(id)sender {[self directCall];//監(jiān)聽電話__weak typeof(self) weakSelf = self;self.center = [[CTCallCenter alloc] init];self.center.callEventHandler = ^(CTCall* call) {if ([call.callState isEqualToString:CTCallStateDisconnected]){NSLog(@"Call has been disconnected");}else if ([call.callState isEqualToString:CTCallStateConnected]){NSLog(@"Call has just been connected");}else if([call.callState isEqualToString:CTCallStateIncoming]){NSLog(@"Call is incoming");}else if ([call.callState isEqualToString:CTCallStateDialing]){//監(jiān)聽再進(jìn)入APP時(shí)彈出窗UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AlertViewTest"message:@"message"delegate:weakSelfcancelButtonTitle:@"Cancel"otherButtonTitles:@"OtherBtn",nil];[alert show];NSLog(@"call is dialing");}else{NSLog(@"Nothing is done");}}; }//打電話 結(jié)束完自動(dòng)跳回APP -(void)directCall {NSString *PhoneNum=@"10086";NSURL *phoneURL=[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",PhoneNum]];if (!self.phoneCallWebView) {self.phoneCallWebView=[[UIWebView alloc]initWithFrame:CGRectZero];}[self.phoneCallWebView loadRequest:[NSURLRequest requestWithURL:phoneURL]]; } @end注意:監(jiān)聽電話要引入CoreTelephony.framework,跳轉(zhuǎn)回APP則是通過一個(gè)UIWebView實(shí)現(xiàn)
?
4:UIView的layoutSubviews和drawRect方法何時(shí)調(diào)用
首先兩個(gè)方法都是異步執(zhí)行。layoutSubviews方便數(shù)據(jù)計(jì)算,drawRect方便視圖重繪。
layoutSubviews在以下情況下會(huì)被調(diào)用:1、init初始化不會(huì)觸發(fā)layoutSubviews。
2、addSubview會(huì)觸發(fā)layoutSubviews。3、設(shè)置view的Frame會(huì)觸發(fā)layoutSubviews,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化。
4、滾動(dòng)一個(gè)UIScrollView會(huì)觸發(fā)layoutSubviews。
5、旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件。
6、改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件。 7、直接調(diào)用setLayoutSubviews。 drawRect在以下情況下會(huì)被調(diào)用:
1、如果在UIView初始化時(shí)沒有設(shè)置rect大小,將直接導(dǎo)致drawRect不被自動(dòng)調(diào)用。drawRect 掉用是在Controller->loadView,?Controller->viewDidLoad?兩方法之后掉用的.所以不用擔(dān)心在 控制器中,這些View的drawRect就開始畫了.這樣可以在控制器中設(shè)置一些值給View(如果這些View?draw的時(shí)候需要用到某些變量 值).
2、該方法在調(diào)用sizeToFit后被調(diào)用,所以可以先調(diào)用sizeToFit計(jì)算出size。然后系統(tǒng)自動(dòng)調(diào)用drawRect:方法。3、通過設(shè)置contentMode屬性值為UIViewContentModeRedraw。那么將在每次設(shè)置或更改frame的時(shí)候自動(dòng)調(diào)用drawRect:。
4、直接調(diào)用setNeedsDisplay,或者setNeedsDisplayInRect:觸發(fā)drawRect:,但是有個(gè)前提條件是rect不能為0。
以上1,2推薦;而3,4不提倡 drawRect方法使用注意點(diǎn):
?
1、 若使用UIView繪圖,只能在drawRect:方法中獲取相應(yīng)的contextRef并繪圖。如果在其他方法中獲取將獲取到一個(gè)invalidate 的ref并且不能用于畫圖。drawRect:方法不能手動(dòng)顯示調(diào)用,必須通過調(diào)用setNeedsDisplay?或 者?setNeedsDisplayInRect,讓系統(tǒng)自動(dòng)調(diào)該方法。2、若使用calayer繪圖,只能在drawInContext:?中(類似魚drawRect)繪制,或者在delegate中的相應(yīng)方法繪制。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法
3、若要實(shí)時(shí)畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來掉用setNeedsDisplay實(shí)時(shí)刷新屏幕 5:UIView中的坐標(biāo)轉(zhuǎn)換(convertPoint,convertRect)
// 將像素point由point所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 將像素point從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的像素值 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;// 將rect由rect所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的rect - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view; // 將rect從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的rect - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;例把UITableViewCell中的subview(btn)的frame轉(zhuǎn)換到 controllerA中// controllerA 中有一個(gè)UITableView, UITableView里有多行UITableVieCell,cell上放有一個(gè)button // 在controllerA中實(shí)現(xiàn): CGRect rc = [cell convertRect:cell.btn.frame toView:self.view]; 或 CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell]; // 此rc為btn在controllerA中的rect或當(dāng)已知btn時(shí): CGRect rc = [btn.superview convertRect:btn.frame toView:self.view]; 或 CGRect rc = [self.view convertRect:btn.frame fromView:btn.superview];
?
總結(jié)
以上是生活随笔為你收集整理的iOS开发基础知识--碎片27的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。