iOS UI 视图移动及缩放

移动思路:

设置一个私有属性用来存储一个点,在开始触摸时记录触摸点的位置,在触摸动作移动中记录下移动到的点,求出两个点X轴Y轴的变化量,将原视图的中心点B赋值给新点,将新点得X,Y 加上变化量的到新点A,在将A赋给B,,经过中心点的变化来移动视图

@interface YDview ()

@property (nonatomic, assign)CGPoint beginPoint;
@end

@implementation YDview

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch * touch = [touches anyObject];
    self.beginPoint = [touch locationInView:self];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch * touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];
    CGFloat changeX = point.x - self.beginPoint.x;
    CGFloat changeY = point.y - self.beginPoint.y;
    CGPoint center = self.center;
    center.x += changeX;
    center.y += changeY;
    self.center = center;

}

@end

缩放思路:

需要先开启多点触摸(默认是关闭的)

求出视图的缩放比例A后,将视图的bounts * A 得到新的bounds,有bounds 的改变来控制视图;(这里不能利用frame,原因我说不清(左上角不会变),哪位能说清的麻烦告诉我下)

求出视图的缩放比例A:定义私有属性存放两点(两个手指的)之间的距离. 新距离与旧距离的比例就是视图缩放比例(两手指缩放前后改变的比例)

#import "SuofangView.h"

@interface SuofangView ()
@property (nonatomic, assign)CGFloat beginDistance;
@end
@implementation SuofangView

- (instancetype)initWithFrame:(CGRect)frame

{
    self = [super initWithFrame:frame];
    if (self) {
        self.multipleTouchEnabled = YES;//需要先开启多点触摸
    }
    return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch * touch1 = [[touches allObjects] lastObject];//)touches 是集合类型
    UITouch * touch2 = [[touches allObjects] firstObject];
    CGPoint p1 = [touch1 locationInView:self];
    CGPoint p2 = [touch2 locationInView:self];
    self.beginDistance = [self getDistance:p1 p2:p2];
}

- (CGFloat)getDistance:(CGPoint)p1
                    p2:(CGPoint)p2//求两点距离
{
    return sqrt(pow((p1.x - p2.x), 2) + pow(p1.y - p2.y, 2));
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch * touch1 = [[touches allObjects] lastObject];
    UITouch * touch2 = [[touches allObjects] firstObject];
    CGPoint p1 = [touch1 locationInView:self];
    CGPoint p2 = [touch2 locationInView:self];
    CGFloat distance = [self getDistance:p1 p2:p2];
    
    CGFloat scale = distance / self.beginDistance;
    CGRect newbount = self.bounds;
    newbount.size.height *= scale;
    newbount.size.width *= scale;
    self.bounds = newbount;//把新bounds赋值给self.bounds
    self.beginDistance = distance;//将新距离赋给self.beginDistance,没有这句的话,缩放比例会有误的,自己试试(被除数永远不会变..)
}
@end

时间: 2024-11-07 09:11:00

iOS UI 视图移动及缩放的相关文章

IOS Ui控件 修改位置和尺寸,代码添加控件

所有的UI控件最终都继承自UIView,UI控件的公共属性都定义在UIView中, UIView的常见属性 UIView *superview; 获得自己的父控件对象 NSArray *subviews; 获得自己的所有子控件对象 NSInteger tag; 控件的ID(标识),父控件可以通过tag来找到对应的子控件 CGAffineTransform transform; 控件的形变属性(可以设置旋转角度.比例缩放.平移等属性) CGRect frame; 控件所在矩形框在父控件中的位置和尺

一个可以实时跟踪分析iOS App视图的小工具

一个可以实时跟踪分析iOS App视图的小工具(已开源) GitHub入口:https://github.com/sx1989827/RunTrace 前言 作为iOS的开发者,常常为了UI界面搞得头破血流,你是不是经常遇到这样的痛点:这个view是从哪里来的,它的父视图是什么,它的子视图有哪些,它的frame会发生什么样的变化,它怎么突然隐藏了,它什么时候会被释放掉,对于像自动布局,错误常常如潮水般的涌来,我想动态获取一个view的约束怎么办,我想知道这个view此时此刻和其他哪些view产生

IOS UIScrollView详解 & 图片缩放功能

一 UIScrollView 简介 UIScrollView是能滚动的视图控件,可以通过滚动的方式来展示类容. 二 UIScrollView常见属性 //设置UIScrollView滚动的位置 @property(nonatomic) CGPoint contentOffset;  //设置UIScrollView内容的尺寸,滚动范围 @property(nonatomic) CGSize contentSize;  //设置UIScrollView的4周增加额外的滚动区域 @property(

ios UI控件的简单整理

把该文件复制到.m文件里就能够方便的查找 /** 匿名类目:可以声明方法和变量,属性为private(不允许在外部调用,且不能被继承 */ /** 发送数据的委托方,接收数据的时代理发(即代理的反向传值) 委托方第一步:声明协议 委托方第二步:声明代理指针 委托方第三步:操作完成,告诉代理(即调用代理的方法) 代理第一步:遵守协议 代理第二步:成为代理 代理第三步:实现协议方法 */ // %zd %zi 表示NSInteger // %g 表示数字去掉尾零 //代码块路径 /Users/ms/

iOS UI Tab开发

iOS UI Tab开发(iOS 8) tab这种样式,类似于单选,可以叫radio-style,这是一个现在主流的layout-design,它让APP内容结构清晰,开发分工逻辑明确,经典的就是微信,时钟等 综述一下: 1.UITabBarController继承UIViewController,是一个ViewController container 2.UITabBarController拥有一个(readonly)的TabBar,TabBar拥有一到多个TabBarItem 3.每一个It

Reveal查看第三方app UI视图

Reaveal + iPhone(越狱)分析app的UI视图结构(下图为网易新闻调试界面) 准备工作:1.iPhone越狱,这里使用太极越狱,需在Windows下(虚拟机即可).    1.1.首先阅读太极越狱详细教程 http://www.taig.com/tutorial.html ,备份.设置好iPhone.      1.2.然后在虚拟机中安装iTunesSetup http://www.apple.com/cn/itunes/download/ 和  TaiGJBreak_1201 h

【腾讯TMQ】解放程序猿(媛)的双手—iOS UI自动化测试

解放程序猿(媛)的双手-iOS UI自动化测试 前言 随着移动互联网时代的蓬勃发展,移动终端的自动化测试也在业界日益活跃,总体来看在Android平台上的自动化工具和实践比较多,但是说到iOS平台无论从自动化工具的数量还是质量上就陡降了.究其原因,无外乎是iOS系统的封闭性,加上相对Android用户的数量少,导致对这个平台系统的自动化进展缓慢,据笔者了解到的情况,很多iOS平台的测试人员还处于纯手工测试模式,自动化程度和Android平台无法相论,更别提和PC端相比了. 然而越是困难的事,越是

ios UI的自适应和布局

用户通常想在旋转屏幕时,UI视图中的内容没有减少,UI中的视图控件可以根据当前的设备方向来调整布局,如果没有 自适应和自动布局,当用户旋转屏幕时,有的控件不见了,这会让用户感觉自己失去了对app的控制,从而给你的app 影响非常不好. 自适应 size class 给你带来福音. 想象一下苹果设备中iPad iPhone 6 plus iPhone 6 iPhone5 iPhone5s iPhone4s,  如何使用size class 来表示它们的不同的使用情况了:首先,设备的使用无非就是横屏

ios UI数据库 sqlite小型数据库的增、删、改、查、排序

#import "table.h" @implementation table // 1.创建表 每一列之间用',',如果存在就不创建 create table if not exists t_class( class_id integer primary key autoincrement, class_name varchar, person_count integer default 0) // 1.1// 删除表 drop table if exists t_person //