2019-01-03 09:21:54 kyl282889543 阅读数 274
  • ArcGIS开发arcpy教程

    arcgis数据处理过程中使用到的arcpy脚本,基础教程。有助于gis从业人员开发arcpy脚本便捷处理数据。提供基础与案例应用结合方式,讲解arcpy知识。 1.python基础 2.基本图形创建 3.shapefile数据操作 4.常见数据txt.csv,json,excel数据操作 5.工具打包 (1)添加脚本方式 (2)ArcCatalog添加代码方式 6.arcpy案例应用 (1)几何图形面polygon,点point之间关系应用 (2)面四至坐标提取应用 (3)面求交,找出最大相交面应用 (4)逐条记录导出应用 (5)批量裁剪影像应用 (6)栅格数据批量定义投影以及工具打包应用

    975 人正在学习 去看看 秦荣波

获取两个矩形的相交区域

//definiton a rect
CGRect rect1 = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);

//获取2个矩形的相交区域
rect = CGRectIntersection(rect, bounds);

//create smaller or bigger rect(have same center)
CGRect rect2 = CGRectInset(rect, 32.0f, 32.0f);

//CGRect and NSString
NSString *string = NSStringFromCGRect(rect1);
rect1 = CGRectFromString(string);

//zero
CGRectZero

//full screen rect
[[UIScreen mainScreen] applicationFrame];

常用函数:
CGRectContainsPoint(); //点是否在矩形中
CGRectContainsRect(); //返回是否第一个矩形包含了第二长方形
CGRectIntersectsRect(); //返回两个矩形是否相交
CGRectIntersection(); //两个矩形的相交
CGPointEqualToPoint(); //两个点是否是一个点
CGSizeEqualToSize(); //两个size是否一样

swift 中Rect判断

你可以将区域对象,看作是点对象和尺寸对象的组合

首先导入需要使用到底界面工具框架

import UIKit
然后初始化一个区域对象,
它的原点位于(0,0),宽度和高度都是100

let rect = CGRect(x: 0,y: 0,width: 100,height: 100)
从输出的区域对象的字符描述可以看出,
区域对象由大括号包括,并由x、y、宽度和高度四个值组合而成

rect.debugDescription
区域对象可以由点对象和尺寸对象组合而成,
首先定义一个位于原点的点对象

let ori = CGPoint.zero
接着初始化一个宽度和高度都是100的尺寸对象

let si = CGSize(width: 100,height: 100)
然后使用刚刚创建的点对象和尺寸对象,初始化一个区域对象,
该初始化方法包含原点和尺寸两个参数

let secondRect = CGRect(origin: ori,size: si)
查询区域对象的原点坐标

1 secondRect.origin.x
2 secondRect.origin.y
查询区域对象的宽度和高度

1 secondRect.size.width
2 secondRect.size.height
也可以直接获取区域对象的宽度和高度属性

1 secondRect.width
2 secondRect.height
通过水平和垂直方向上的最小值和最大值,
可以查询区域对象左上角和右下角的坐标

1 secondRect.minX
2 secondRect.maxX
3 secondRect.minY
4 secondRect.maxY
判断该区域是否包含某个指定的点

secondRect.contains(CGPoint(x: 10,y: 10))
判断该区域是否包含某个指定的区域

secondRect.contains(CGRect(x: 0,y: 0,width: 50,height: 50))
判断该区域是否和另一个区域相等

secondRect.equalTo(rect)
获取另一个区域对象,该区域对象位于原区域对象的内部,
并且和原区域对象的四周保持10点的距离

secondRect.insetBy(dx: 10,dy: 10)
获得两个区域相交的区域,并观测右侧输出的结果

secondRect.intersection(CGRect(x: 40,y: 40,width: 100,height: 20))
判断两个区域是否相交

secondRect.intersects(CGRect(x: 80,y: 0,width: 100,height: 100))
获得一个区域对象,在水平和垂直方向各偏移10点之后的区域

secondRect.offsetBy(dx: 10,dy: 10)
获得两个区域合并之后的区域

secondRect.union(CGRect(x: 50,y: 50,width: 100,height: 100))
和点对象尺寸对象相同,同样可以将一个格式化的字符串,转换为区域对象

CGRectFromString("{{0,0},{100,100}}")
技巧:将游戏内的二次下载推迟到玩家完成游戏的早期部分之后。为必须进行的应用内下载设计进度条和一些视觉效果,用于吸引玩家注意。

2016-12-28 15:07:58 u012234115 阅读数 629
  • ArcGIS开发arcpy教程

    arcgis数据处理过程中使用到的arcpy脚本,基础教程。有助于gis从业人员开发arcpy脚本便捷处理数据。提供基础与案例应用结合方式,讲解arcpy知识。 1.python基础 2.基本图形创建 3.shapefile数据操作 4.常见数据txt.csv,json,excel数据操作 5.工具打包 (1)添加脚本方式 (2)ArcCatalog添加代码方式 6.arcpy案例应用 (1)几何图形面polygon,点point之间关系应用 (2)面四至坐标提取应用 (3)面求交,找出最大相交面应用 (4)逐条记录导出应用 (5)批量裁剪影像应用 (6)栅格数据批量定义投影以及工具打包应用

    975 人正在学习 去看看 秦荣波

一个普通的手势解锁插件,可以判断路线交叉

预览



思路

(1)画点画线
dot和line,用ios自带绘图来做
#pragma mark - 搭建初始UI
- (void)createUI
{
    // 提示语
    tipLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.frame.size.width / 2 - 100, 60, 200, 30)];
    tipLabel.text = @"请输入手势";
    tipLabel.textAlignment = NSTextAlignmentCenter;
    tipLabel.textColor = [UIColor redColor];
    [self addSubview:tipLabel];
    
    // 按钮
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(self.frame.size.width / 2 - 50, 120, 100, 30);
    [button setTitle:@"隐藏手势" forState:UIControlStateNormal];
    [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [button addTarget:self
               action:@selector(hide)
     forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:button];
    
    // 九宫格点阵,每个点用view替代,用tag设置索引(其实可以设置图片,用数组存起来索引)
    CGFloat dotSpace = (self.frame.size.width - kCol * kDotSize) / (kCol + 1); // 点之间的间距
    
    for (int i = 0; i < kRow; i++)
    {
        for (int j = 0; j < kCol; j++)
        {
            UIView *dotView = [[UIView alloc] initWithFrame:CGRectMake(dotSpace + (kDotSize + dotSpace) * j, kBoardTop + dotSpace + (kDotSize + dotSpace) * i, kDotSize, kDotSize)];
            dotView.backgroundColor = [UIColor lightGrayColor]; // 初始颜色
            dotView.tag = (i * kCol + j) + 1000; // 索引
            dotView.layer.cornerRadius = kDotSize / 2; // 切成圆形
            [self addSubview:dotView];
        }
    }
}

#pragma mark - 触摸事件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 清除之前的轨迹
    [lineArray removeAllObjects];
    
    // 把所有的点状态重置
    [gestureDotIndexArray removeAllObjects];
    for (int i = 0; i < kRow * kCol; i++)
    {
        UIView *dotView = [self viewWithTag:i + 1000];
        
        dotView.userInteractionEnabled = YES;
        dotView.backgroundColor = [UIColor lightGrayColor];
    }
    
    // 获取第一个点
    startPoint = [touches.anyObject locationInView:self];
    
    // 判断如果在某个dot里面就开始记录
    for (int i = 0; i < kRow * kCol; i++)
    {
        UIView *dotView = [self viewWithTag:i + 1000];
        if (CGRectContainsPoint(dotView.frame, startPoint))
        {
            // 第一个点选中了
            isStartDotSelected = YES;
            
            // 如果在里面就标记
            dotView.backgroundColor = [UIColor greenColor];
            dotView.userInteractionEnabled = NO; // 可以用其他的标志字,这里就简单用这个属性好了
            
            // 更改起始点为中心
            startPoint = dotView.center;
            
            // dot添加到轨迹
            [gestureDotIndexArray addObject:[NSNumber numberWithInt:i]];
        }
    }
    
}



- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 终止点
    endPoint = [touches.anyObject locationInView:self];
    
    // 一定在起始点选中的基础上才有轨迹
    if (isStartDotSelected)
    {
        // 临时轨迹
        tempLine = [UIBezierPath bezierPath];
        [tempLine moveToPoint:startPoint];
        [tempLine addLineToPoint:endPoint];
        
#ifdef check_intersect
        // 判断与之前的线段是否相交,不算最近的一个有接点的线段(目前体验不够好)
        for (int i = 0; lineArray.count > 0 && i < lineArray.count - 1; i++)
        {
            UIBezierPath *path = lineArray[i];
            
            // 得到线段端点数组
            NSArray *tempLinePoints = [self getPointsFromPath:tempLine];
            NSArray *pathPoints = [self getPointsFromPath:path];
            
            // array里面都是元数据,value转成point,因为array里面只能存value
            NSValue *value1 = tempLinePoints.firstObject;
            CGPoint p1 = [value1 CGPointValue];
            
            NSValue *value2 = tempLinePoints.lastObject;
            CGPoint p2 = [value2 CGPointValue];
            
            NSValue *value3 = pathPoints.firstObject;
            CGPoint p3 = [value3 CGPointValue];
            
            NSValue *value4 = pathPoints.lastObject;
            CGPoint p4 = [value4 CGPointValue];
            
            // 相交测试
            if (checkLineIntersection(p1, p2, p3, p4))
            {
                [self shakeAnimationForView:tipLabel];
                [self resetGesture];
            }
        }
#endif
        
        // 判断终点是否在dot里面,并且这个点没有划过
        for (int i = 0; i < kRow * kCol; i++)
        {
            UIView *dotView = [self viewWithTag:i + 1000];
            
            // 必须两个条件一起判保证点不会重入
            if (CGRectContainsPoint(dotView.frame, endPoint) && dotView.userInteractionEnabled)
            {
                // 如果在里面就标记
                dotView.backgroundColor = [UIColor colorWithRed:(arc4random() % 256) / 256.0f
                                                          green:(arc4random() % 256) / 256.0f
                                                           blue:(arc4random() % 256) / 256.0f
                                                          alpha: 1];
                dotView.userInteractionEnabled = NO; // 可以用其他的标志字,这里就简单用这个属性好了
                
                // dot添加到轨迹
                [gestureDotIndexArray addObject:[NSNumber numberWithInt:i]];
                
                // 重新规划路径
                
                UIBezierPath *settledLine = [[UIBezierPath alloc] init];
                [settledLine moveToPoint:startPoint];
                [settledLine addLineToPoint:dotView.center];
                
                // 存储路径
                [lineArray addObject:settledLine];
                
                // 此处判断一下线路是否相交
                
                
                // 修改起始点
                startPoint = dotView.center;
            }
        }
    }
    // 重绘
    [self setNeedsDisplay];
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 处理密码
    [self processPassword];
    
    // 最后清除存储的密码轨迹
    [self resetGesture];
    
    // 重绘
    [self setNeedsDisplay];
    
}

#pragma mark - 绘制
- (void)drawRect:(CGRect)rect
{
    // 绘制临时路径
    
    tempLine.lineWidth = 5;
    tempLine.lineJoinStyle = kCGLineJoinRound;
    [[UIColor redColor] set];
    [tempLine stroke];
    
    // 绘制轨迹
    for (UIBezierPath *path in lineArray)
    {
        path.lineWidth = 5;
        path.lineJoinStyle = kCGLineJoinRound;
        [[UIColor blueColor] set];
        [path stroke];
    }
}



(2)密码处理
密码可以是字符串,存到本地,或者用于二次加密
#pragma mark - 处理手势得到的密码
- (void)processPassword
{
    // 得到密码
    NSMutableString *passwordStr = [[NSMutableString alloc] init];
    for (NSNumber *indexNumber in gestureDotIndexArray)
    {
        [passwordStr appendString:[NSString stringWithFormat:@"%d", indexNumber.intValue]];
    }
    
    switch (_gestureState)
    {
        case CREATE_STATE:
        {
            pwdSetCount++;
            
            if (pwdSetCount == 1)
            {
                // 密码存文件(或者全局变量)
                [[NSUserDefaults standardUserDefaults] setObject:passwordStr forKey:kPasswordKey];
                [[NSUserDefaults standardUserDefaults] synchronize];
                
                tipLabel.text = @"请再输一次";
                [self shakeAnimationForView:tipLabel];
            }
            else if (pwdSetCount == kPwdCount)
            {
                // 检验跟第一次是否一样
                NSString *originalPwd = [[NSUserDefaults standardUserDefaults] objectForKey:kPasswordKey];
                if ([passwordStr isEqualToString:originalPwd])
                {
                    if (self.passwordSetBlock)
                    {
                        self.passwordSetBlock([NSString stringWithFormat:@"password created: %@", passwordStr]);
                    }
                    [self hide];
                }
                else
                {
                    tipLabel.text = @"密码校验与第一次不同,重新输入";
                    [self shakeAnimationForView:tipLabel];
                    pwdSetCount--; // 减回去
                }
            }
            
            
            
        }
            break;
            
        case VERIFY_STATE:
        {
            // 校验密码
            NSString *originalPwd = [[NSUserDefaults standardUserDefaults] objectForKey:kPasswordKey];
            if ([passwordStr isEqualToString:originalPwd])
            {
                if (self.passwordSetBlock)
                {
                    self.passwordSetBlock(@"password verify success!");
                }
                [self hide];
            }
            else
            {
                if (self.passwordSetBlock)
                {
                    self.passwordSetBlock(@"password verify failed!");
                }
                
                tipLabel.text = @"密码校验失败,重新输入";
                [self shakeAnimationForView:tipLabel];
            }
            
        }
            break;
            
        default:
            break;
    }
}

(3)线段相交检测
如果要求画出的手势路线不能相交,需要线段相交算法,从线段获得两个端点的坐标
#pragma mark - 线段相交测试(p1,p2是线段1的端点,p3,p4是线段2的端点)
bool checkLineIntersection(CGPoint p1, CGPoint p2, CGPoint p3, CGPoint p4)
{
    CGFloat denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y);
    
    // In this case the lines are parallel so we assume they don't intersect~
    if (denominator <= (1e-6) && denominator >= -(1e-6))
    {
        return true;
    }
    
    // amazing~
    CGFloat ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator;
    CGFloat ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator;
    
    if (ua >= 0.0f && ua <= 1.0f && ub >= 0.0f && ub <= 1.0f)
    {
        return true;
    }
    return false;
}

#pragma mark - 从贝塞尔曲线上得到点列表
// http://stackoverflow.com/questions/3051760/how-to-get-a-list-of-points-from-a-uibezierpath
- (NSMutableArray *)getPointsFromPath:(UIBezierPath *)path
{
    CGPathRef pathCGPath = path.CGPath;
    NSMutableArray *bezierPoints = [NSMutableArray array];
    CGPathApply(pathCGPath, (__bridge void * _Nullable)(bezierPoints), MyCGPathApplierFunc);
    
    return bezierPoints.copy;
}

void MyCGPathApplierFunc(void *arrayInfo, const CGPathElement *element)
{
    NSMutableArray *bezierPoints = (__bridge NSMutableArray *)arrayInfo;
    
    CGPoint *points = element->points;
    CGPathElementType type = element->type;
    
    switch(type)
    {
        case kCGPathElementMoveToPoint: // contains 1 point
            [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
            break;
            
        case kCGPathElementAddLineToPoint: // contains 1 point
            [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
            break;
            
        case kCGPathElementAddQuadCurveToPoint: // contains 2 points
            [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
            [bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]];
            break;
            
        case kCGPathElementAddCurveToPoint: // contains 3 points
            [bezierPoints addObject:[NSValue valueWithCGPoint:points[0]]];
            [bezierPoints addObject:[NSValue valueWithCGPoint:points[1]]];
            [bezierPoints addObject:[NSValue valueWithCGPoint:points[2]]];
            break;
            
        case kCGPathElementCloseSubpath: // contains no point
            break;
    }
}

源代码下载

github:手势解锁


2016-04-21 20:43:40 u012806757 阅读数 1221
  • ArcGIS开发arcpy教程

    arcgis数据处理过程中使用到的arcpy脚本,基础教程。有助于gis从业人员开发arcpy脚本便捷处理数据。提供基础与案例应用结合方式,讲解arcpy知识。 1.python基础 2.基本图形创建 3.shapefile数据操作 4.常见数据txt.csv,json,excel数据操作 5.工具打包 (1)添加脚本方式 (2)ArcCatalog添加代码方式 6.arcpy案例应用 (1)几何图形面polygon,点point之间关系应用 (2)面四至坐标提取应用 (3)面求交,找出最大相交面应用 (4)逐条记录导出应用 (5)批量裁剪影像应用 (6)栅格数据批量定义投影以及工具打包应用

    975 人正在学习 去看看 秦荣波
问题定义:定义一个矩形类,实现判断矩形是否相交的方法。

思路:给定两个边与坐标轴平行的矩形,分别由左上角与右下角两点指定,即矩形(P1,P2)与(P3,P4),判断两矩形是否相交。如下图所示,首先求出P1与P3点在X方向较大值与Y方向较大值的交点,在下图中就是P3,用红点(记为M点)表示。然后求出P2与P4点在X方向较小值与Y方向较小值的交点,在下图中就是P2,用橙色点(记为N点)表示。如果M点的X坐标和Y坐标值均比N点相应的X坐标和Y坐标值小,亦即M和N可以分别构成一个矩形的左上角点和右上角点,则两矩形相交;其余情况则不相交。

01165312-e31340b5153448d2a02a10dd82de62d2.png01170805-2e6a26fef97c4e1ca7104664a2e5c589.png01171401-cde500e2eefc4319a3c63c484d820f62.png

WFRect

#import <Foundation/Foundation.h>


@interface WFRect : WFShape


@property (nonatomic,assigndouble width;

@property (nonatomic,assigndouble height;



+ (instancetype) rectWithX : (double) x

                         y : (double) y

                      width: (double) width

                     height: (double) height;


- (instancetype)initWithX : (double) x

                        y : (double) y

                     width: (double) width

                    height: (double) height;

@end



WFRect.m

#import "WFRect.h"


@implementation WFRect


+(instancetype)rectWithX:(double)x

                       y:(double)y

                  width:(double)width

                  height:(double)height{

    return [[self allocinitWithX:x y:y width:width height:height];

}


- (instancetype)initWithX:(double)x

                        y:(double)y

                   width:(double)width

                    height:(double)height{

    if (self = [super init]) {

_x = x;

_y = y;

        _width = width;

        _height = height;

    }

    return self;

}


-(BOOL) intersects:(WFRect *) other{

    double redX = _x > other.x ? _x : other.x;

    double redY = _y > other.y ? _y : other.y;

    double yellowX = _x + _width < other.x + other.width ?_x + _width : other.x + other.width;

    double yellowY = _y + _height < other.y + other.height ? _y +_height : other.y + other.height;

    return (yellowX > redX && yellowY > redY);

}

@end

2016-05-16 11:03:40 zlhuan0629 阅读数 484
  • ArcGIS开发arcpy教程

    arcgis数据处理过程中使用到的arcpy脚本,基础教程。有助于gis从业人员开发arcpy脚本便捷处理数据。提供基础与案例应用结合方式,讲解arcpy知识。 1.python基础 2.基本图形创建 3.shapefile数据操作 4.常见数据txt.csv,json,excel数据操作 5.工具打包 (1)添加脚本方式 (2)ArcCatalog添加代码方式 6.arcpy案例应用 (1)几何图形面polygon,点point之间关系应用 (2)面四至坐标提取应用 (3)面求交,找出最大相交面应用 (4)逐条记录导出应用 (5)批量裁剪影像应用 (6)栅格数据批量定义投影以及工具打包应用

    975 人正在学习 去看看 秦荣波

1,判断一个点是否被一个CGRect包含

BOOL contains = CGRectContainsPoint(CGRect rect, CGPoint point);


2,判断两个View 是否相交

BOOL contains = CGRectContainsRect(CGRect rect1, CGRect rect2);

或者

BOOL contains = CGRectIntersectsRect(CGRect rect1, CGRect rect2);


3,取值CGRect的边缘值

float float_ = CGRectGetMaxX(CGRect rect);返回矩形右边缘的坐标

CGRectGetMinY返回矩形顶部的坐标

CGRectGetMidX返回矩形中心X的坐标

CGRectGetMidY 返回矩形中心Y的坐标

CGRectGetMinX 返回矩形左边缘的坐标

CGRectGetMaxY 返回矩形底部的坐标




2018-03-17 20:50:51 u011374318 阅读数 177
  • ArcGIS开发arcpy教程

    arcgis数据处理过程中使用到的arcpy脚本,基础教程。有助于gis从业人员开发arcpy脚本便捷处理数据。提供基础与案例应用结合方式,讲解arcpy知识。 1.python基础 2.基本图形创建 3.shapefile数据操作 4.常见数据txt.csv,json,excel数据操作 5.工具打包 (1)添加脚本方式 (2)ArcCatalog添加代码方式 6.arcpy案例应用 (1)几何图形面polygon,点point之间关系应用 (2)面四至坐标提取应用 (3)面求交,找出最大相交面应用 (4)逐条记录导出应用 (5)批量裁剪影像应用 (6)栅格数据批量定义投影以及工具打包应用

    975 人正在学习 去看看 秦荣波

判断视图是否相交以及是否被键盘遮盖

@interface UIView (Util)

///返回视图是否相交,若相交,offset 的值表示避免相交需要的位移
- (BOOL)isCoveredByView:(UIView *)view offset:(CGFloat *)offset;

///返回视图是否被键盘遮盖,若是,offset 的值表示视图要避免遮盖的位移量
- (BOOL)isCoveredByBoard:(CGRect)keyboardRect offset:(CGFloat *)offset;

@end

@implementation UIView (Util)

#pragma mark 判断当前视图是否被其他视图遮盖
- (BOOL)isCoveredByView:(UIView *)view offset:(CGFloat *)offset {
    if (!self || !view) {
        return NO;
    }
    if (![self superview]) {
        return NO;
    }
    if (self.hidden || view.hidden) {
        return NO;
    }
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];

    CGRect viewRect;
    if([view isKindOfClass:[UIWindow class]]){
        viewRect = [(UIWindow*)view convertRect:view.frame toWindow:keyWindow];
    }else {
        viewRect = [view.superview convertRect:view.frame toView:keyWindow];
    }

    CGRect rect = [self.superview convertRect:self.frame toView:keyWindow];
    if (CGRectIsEmpty(rect) || CGRectIsNull(rect) || CGSizeEqualToSize(rect.size, CGSizeZero)) {
        return NO;
    }
    CGFloat heightOfCovered = viewRect.origin.y - rect.origin.y - rect.size.height;
    heightOfCovered = heightOfCovered > -viewRect.size.height ? heightOfCovered : -viewRect.size.height;

    *offset = heightOfCovered;
    return CGRectIntersectsRect(rect, viewRect);

}

#pragma mark 判断当前视图是否被键盘遮盖
- (BOOL)isCoveredByBoard:(CGRect)keyboardRect offset:(CGFloat *)offset {
    if (!self) {
        return NO;
    }
    if (![self superview]) {
        return NO;
    }
    if (self.hidden) {
        return NO;
    }
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
    NSArray *windows = [[UIApplication sharedApplication] windows];
    UIWindow *keyboardWindow;
    for (id window in windows) {

        NSString *keyboardWindowString = NSStringFromClass([window class]);
        if ([keyboardWindowString isEqualToString:@"UITextEffectsWindow"]) {
            keyboardWindow = window;
            break;
        }
    }
    if (keyboardWindow == nil) return NO;

    keyboardRect = [keyboardWindow convertRect:keyboardRect toWindow:keyWindow];
    CGRect rect = [self.superview convertRect:self.frame toView:keyWindow];
    if (CGRectIsEmpty(rect) || CGRectIsNull(rect) || CGSizeEqualToSize(rect.size, CGSizeZero)) {
        return NO;
    }
    CGFloat heightOfCovered = keyboardRect.origin.y - rect.origin.y - rect.size.height;
    heightOfCovered = heightOfCovered > -keyboardRect.size.height ? heightOfCovered : -keyboardRect.size.height;

    *offset = heightOfCovered;
    return CGRectIntersectsRect(rect, keyboardRect);
}

@end
#pragma mark - 键盘显示
- (void)keyboardWillShow:(NSNotification *)notification{
    if ([self.textField isFirstResponder]) {
        CGRect keyboardFrame = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

        CGFloat offset;
        if ([self.textField isCoveredByBoard:keyboardFrame offset:&offset]){
            CGRect rect = self.textField.frame;
            rect.origin.y += offset;
            self.textField.frame = rect;
        }
    }
}

IOS_绘画交集圆填充

阅读数 1319

IOS多线程之NSThread

阅读数 282

没有更多推荐了,返回首页