iOS开发基础知识--碎片27

摘要:
self.phoneCallWebView){self.phoneCoallWebView=[[UIWebViewalloc]initWithFrame:CGRectZero];}[self.phoneCCallWebViewloadRequest:[NSURLRequestWithURL:phoneURL]];}@结束说明:CoreTelephony应引入监控电话框架。跳回到APP就是使用UIWebView来实现4:当UIView layoutSubviews和drawRect方法调用前两个方法时,这两个方法是异步执行的。layoutSubviews便于数据计算,drawRect便于视图重绘。在以下情况下将调用LayoutSubviews:1.初始化不会触发LayoutSubviews。
 
 iOS开发基础知识--碎片27

1: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:如果参数是小数,则求本身的四舍五入。
ceil:如果参数是小数,则求最小的整数但不小于本身.
floor:如果参数是小数,则求最大的整数但不大于本身. 

Example:如何值是3.4的话,则
3.4 -- round 3.000000
    -- ceil 4.000000
    -- floor 3.00000
复制代码

2:对数组进行转换,把原来二个值转化成一条的记录(满足左右排版布局)

复制代码
NSMutableArray *mnewArray=[[NSMutableArray alloc]init];
    NSArray *nameArray=@[@"1",@"2",@"3",@"4",@"5",@"6"];
    int allCount=0;
    if (nameArray.count%2==1) {
        //说明是奇数
        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里,并监听它的状态

复制代码
#import "ViewController.h"
#import <CoreTelephony/CTCall.h>
#import <CoreTelephony/CTCallCenter.h>

@interface ViewController ()<UIAlertViewDelegate>
@property(strong,nonatomic)UIWebView *phoneCallWebView;
//电话监听
@property (nonatomic, strong) CTCallCenter * center;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}

- (IBAction)sdfsdfsdfs:(id)sender {

    [self directCall];
    
    //监听电话
    __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])
        {
            //监听再进入APP时弹出窗
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AlertViewTest"
                                                            message:@"message"
                                                           delegate:weakSelf
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"OtherBtn",nil];
            [alert show];
            NSLog(@"call is dialing");
        }
        else
        {
            NSLog(@"Nothing is done");
        }
    };
}

//打电话 结束完自动跳回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
复制代码

注意:监听电话要引入CoreTelephony.framework,跳转回APP则是通过一个UIWebView实现

4:UIView的layoutSubviews和drawRect方法何时调用

首先两个方法都是异步执行。layoutSubviews方便数据计算,drawRect方便视图重绘。

layoutSubviews在以下情况下会被调用:

1、init初始化不会触发layoutSubviews。

2、addSubview会触发layoutSubviews。
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
4、滚动一个UIScrollView会触发layoutSubviews。
5、旋转Screen会触发父UIView上的layoutSubviews事件。
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
7、直接调用setLayoutSubviews。
 
drawRect在以下情况下会被调用:

1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量 值).

2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
以上1,2推荐;而3,4不提倡
 
drawRect方法使用注意点:
1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
 
5:UIView中的坐标转换(convertPoint,convertRect)
复制代码
// 将像素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];
复制代码

 

免责声明:文章转载自《iOS开发基础知识--碎片27》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇YARN Application执行流程Spring相关配置及工厂模式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MFC中使用Picture Control控件显示OpenCV图像几种方法

本文参考自https://blog.csdn.net/byxdaz/article/details/88091164 本人测试代码如下: // ShowImageInMFCDlg.h : 头文件 // #pragma once #include <vector> #include <string> #include <ope...

uni-app移动端开发中ios/安卓--坑和经验总结

1、 ios new时间对象,需要用逗号隔开传日期的方式, 不支持 new Date('2019-03-01 08:00:00') 格式; 支持以下两种方式: 2、 ios个别版本对fixed的属性的支持性不好,需要用absolute替代; 3、 input 的 placeholder会出现文本位置偏上的时候             input 的pl...

[转]iOS开发使用半透明模糊效果方法整理

转自:http://www.molotang.com/articles/1921.html 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用。包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开始大量使用半透明模糊。 在iOS开发当中,我们有很多选择可以做半透...

MFC避免窗口闪烁的方法(OnEraseBkgnd) .

在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图...

OnPaint和OnDraw的区别

问题: 我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同? 答: OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows会发送两个消息WM_PAINT(通知客户区...

iOS开发——你真的会用SDWebImage?

http://www.cocoachina.com/ios/20160503/16064.html 本文授权转载,作者:hosea_zhou(简书) SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高。但是你真的会用吗?本文接下来将通过例子分析如何合理使用SDWebImage。 使用场景:自定义的UITableViewCell上有图片需要...