欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS簡單抽屜效果的實(shí)現(xiàn)方法

 更新時(shí)間:2022年08月08日 11:08:37   作者:綠葉清風(fēng)  
這篇文章主要為大家詳細(xì)介紹了iOS簡單抽屜效果的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了iOS實(shí)現(xiàn)簡單抽屜效果的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)思路及步驟:

1、首先準(zhǔn)備要滑動的view

#warning 第一步
- (void)addChildView
{
? ? // left
? ? UIView *leftView = [[UIView alloc] initWithFrame:self.view.bounds];
? ? leftView.backgroundColor = [UIColor greenColor];
? ? [self.view addSubview:leftView];
? ? _leftView = leftView;
? ??
? ? // right
? ? UIView *rightView = [[UIView alloc] initWithFrame:self.view.bounds];
? ? rightView.backgroundColor = [UIColor blueColor];
? ? [self.view addSubview:rightView];
? ? _rightView = rightView;
? ??
? ? // mainView
? ? UIView *mainView = [[UIView alloc] initWithFrame:self.view.bounds];
? ? mainView.backgroundColor = [UIColor redColor];
? ? [self.view addSubview:mainView];
? ? _mainView = mainView;
}

2、監(jiān)聽觸摸事件,記錄橫軸方向的偏移量,有了偏移量就可以通過偏移量改動視圖的位置

#warning 第二布
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
? ? // 獲取UITouch對象
? ? UITouch *touch = [touches anyObject];
? ??
? ? // 獲取當(dāng)前點(diǎn)
? ? CGPoint currentPoint = [touch locationInView:self.view];
? ??
? ? // 獲取上一個(gè)點(diǎn)
? ? CGPoint prePoint = [touch previousLocationInView:self.view];
? ??
? ? // x軸偏移量:當(dāng)手指移動一點(diǎn)的時(shí)候,x偏移多少
? ? CGFloat offsetX = currentPoint.x - prePoint.x;
? ??
? ? // 設(shè)置當(dāng)前主視圖的frame
? ? _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX];
? ??
? ??
? ? _isDraging = YES;
}
? 如何實(shí)時(shí)監(jiān)聽一個(gè)對象的屬性(只能監(jiān)聽對象,不能監(jiān)聽結(jié)構(gòu)體)?kvo
? // 1.監(jiān)聽 ?2 ,實(shí)現(xiàn):observeValueForKeyPath 方法
? /**
? ? ?* ?給_mainView添加一個(gè)觀察者
? ? ?*
? ? ?* ?KeyPath:監(jiān)聽frame這個(gè)屬性
? ? ?*
? ? ?* ?options:監(jiān)聽新值的改變
? ? ?*/
? ? [_mainView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; //實(shí)時(shí)監(jiān)聽mainview的frame
?
?
// 當(dāng)_mainView的frame屬性改變的時(shí)候就會調(diào)用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
? ? NSLog(@"%@", NSStringFromCGRect(_mainView.frame));//當(dāng)前的frame
? ??
? ? if (_mainView.frame.origin.x < 0) { // 主界面的x<0,往左移動
? ? ? ? // 顯示右邊
? ? ? ? _rightView.hidden = NO;
? ? ? ? // 隱藏左邊
? ? ? ? _leftView.hidden = YES;
? ? }else if (_mainView.frame.origin.x > 0){ // 往右移動
? ? ? ? // 顯示左邊
? ? ? ? _rightView.hidden = YES;
? ? ? ? // 隱藏右邊
? ? ? ? _leftView.hidden = NO;
? ? ? ??
? ? }
}?

當(dāng)x軸偏移的時(shí)候,如何縮放高度?
當(dāng)x偏移時(shí),y軸縮小為: x的偏移量/

#define HMMaxY 60
// 當(dāng)手指偏移一點(diǎn),根據(jù)X軸的偏移量算出當(dāng)前主視圖的frame
- (CGRect)getCurrentFrameWithOffsetX:(CGFloat)offsetX
{
? ? CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
? ? CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
? ??
? ? // 獲取y軸偏移量,手指每移動一點(diǎn),y軸偏移多少
? ? CGFloat offsetY = offsetX * HMMaxY / screenW;//HMMaxY 縮放的最大Y?
? ??
? ? CGFloat scale = (screenH - 2 * offsetY) / screenH;//比例?
? ??
? ? if (_mainView.frame.origin.x < 0) { // 往左邊滑動
? ? ? ? scale = (screenH + 2 * offsetY) / screenH;
? ? }
? ??
? ? // 獲取之前的frame
? ? CGRect frame = _mainView.frame;
? ? frame.origin.x += offsetX;
? ? frame.size.height = frame.size.height *scale;
? ? frame.size.width = frame.size.width *scale;
? ? frame.origin.y = (screenH - frame.size.height) * 0.5;
? ??
? ? return frame;
}

定位:

#define HMRTarget 250
#define HMLTarget -220
/*
?_mainView.frame.origin.x > screenW * 0.5 定位到右邊
? CGRectGetMaxX(_mainView.frame) < screenW * 0.5 定位到左邊 -220
?
?*/
// 定位
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
? ??
? ? // 復(fù)位
? ? if (_isDraging == NO && _mainView.frame.origin.x != 0) {
? ? ? ? [UIView animateWithDuration:0.25 animations:^{
? ? ? ? ? ??
? ? ? ? ? ? _mainView.frame = self.view.bounds;
? ? ? ? }];
? ? }
? ??
? ??
? ? CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
? ??
? ? CGFloat target = 0;
? ? if (_mainView.frame.origin.x > screenW * 0.5) { // 定位到右邊
? ? ? ? target = HMRTarget;
? ? }else if (CGRectGetMaxX(_mainView.frame) < screenW * 0.5) { // 定位到左邊
? ? ? ? target = HMLTarget;
? ? }
? ??
? ? [UIView animateWithDuration:0.25 animations:^{
? ? ? ??
? ? ? ? if (target) { // 在需要定位左邊或者右邊
? ? ? ? ? ??
? ? ? ? ? ? // 獲取x軸偏移量
? ? ? ? ? ? CGFloat offsetX = target - _mainView.frame.origin.x;
? ? ? ? ? ??
? ? ? ? ? ? // 設(shè)置當(dāng)前主視圖的frame
? ? ? ? ? ? _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX];
? ? ? ? ? ??
? ? ? ? }else{ // 還原
? ? ? ? ? ? _mainView.frame = self.view.bounds;
? ? ? ? }
? ? }];
? ??
? ? _isDraging = NO;
? ??
}

全:

@interface HMDrawViewController ()
?
?
@property (nonatomic, assign) BOOL isDraging;
@end
?
@implementation HMDrawViewController
?
?
- (void)viewDidLoad
{
? ? // UIViewController
? ? [super viewDidLoad];
? ? // Do any additional setup after loading the view.
? ?
? ? // 1.添加子控件
? ? [self addChildView];
#warning 第三步 觀察_mainView的frame改變
? ? // 2.監(jiān)聽
? ? /**
? ? ?* ?給_mainView添加一個(gè)觀察者
? ? ?*
? ? ?* ?KeyPath:監(jiān)聽frame這個(gè)屬性
? ? ?*
? ? ?* ?options:監(jiān)聽新值的改變
? ? ?*/
? ? [_mainView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
? ?
}
?
// 當(dāng)_mainView的frame屬性改變的時(shí)候就會調(diào)用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
? ? NSLog(@"%@", NSStringFromCGRect(_mainView.frame));
? ??
? ? if (_mainView.frame.origin.x < 0) { // 往左移動
? ? ? ? // 顯示右邊
? ? ? ? _rightView.hidden = NO;
? ? ? ? // 隱藏左邊
? ? ? ? _leftView.hidden = YES;
? ? }else if (_mainView.frame.origin.x > 0){ // 往右移動
? ? ? ? // 顯示左邊
? ? ? ? _rightView.hidden = YES;
? ? ? ? // 隱藏右邊
? ? ? ? _leftView.hidden = NO;
? ? ? ??
? ? }
}
?
#warning 第一步
- (void)addChildView
{
? ? // left
? ? UIView *leftView = [[UIView alloc] initWithFrame:self.view.bounds];
? ? leftView.backgroundColor = [UIColor greenColor];
? ? [self.view addSubview:leftView];
? ? _leftView = leftView;
? ??
? ? // right
? ? UIView *rightView = [[UIView alloc] initWithFrame:self.view.bounds];
? ? rightView.backgroundColor = [UIColor blueColor];
? ? [self.view addSubview:rightView];
? ? _rightView = rightView;
? ??
? ? // mainView
? ? UIView *mainView = [[UIView alloc] initWithFrame:self.view.bounds];
? ? mainView.backgroundColor = [UIColor redColor];
? ? [self.view addSubview:mainView];
? ? _mainView = mainView;
}
?
#warning 第二布
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
? ? // 獲取UITouch對象
? ? UITouch *touch = [touches anyObject];
? ??
? ? // 獲取當(dāng)前點(diǎn)
? ? CGPoint currentPoint = [touch locationInView:self.view];
? ??
? ? // 獲取上一個(gè)點(diǎn)
? ? CGPoint prePoint = [touch previousLocationInView:self.view];
? ??
? ? // x軸偏移量:當(dāng)手指移動一點(diǎn)的時(shí)候,x偏移多少
? ? CGFloat offsetX = currentPoint.x - prePoint.x;
? ??
? ? // 設(shè)置當(dāng)前主視圖的frame
? ? _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX];
? ??
? ??
? ? _isDraging = YES;
}
#warning 第四步
#define HMMaxY 60
// 當(dāng)手指偏移一點(diǎn),根據(jù)X軸的偏移量算出當(dāng)前主視圖的frame
- (CGRect)getCurrentFrameWithOffsetX:(CGFloat)offsetX
{
? ? CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
? ? CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
? ??
? ? // 獲取y軸偏移量,手指每移動一點(diǎn),y軸偏移多少
? ? CGFloat offsetY = offsetX * HMMaxY / screenW;
? ??
? ? CGFloat scale = (screenH - 2 * offsetY) / screenH;
? ??
? ? if (_mainView.frame.origin.x < 0) { // 往左邊滑動
? ? ? ? scale = (screenH + 2 * offsetY) / screenH;
? ? }
? ??
? ? // 獲取之前的frame
? ? CGRect frame = _mainView.frame;
? ? frame.origin.x += offsetX;
? ? frame.size.height = frame.size.height *scale;
? ? frame.size.width = frame.size.width *scale;
? ? frame.origin.y = (screenH - frame.size.height) * 0.5;
? ??
? ? return frame;
}
?
#define HMRTarget 250
#define HMLTarget -220
/*
?_mainView.frame.origin.x > screenW * 0.5 定位到右邊
? CGRectGetMaxX(_mainView.frame) < screenW * 0.5 定位到左邊 -220
?
?*/
// 定位
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
? ??
? ? // 復(fù)位
? ? if (_isDraging == NO && _mainView.frame.origin.x != 0) {
? ? ? ? [UIView animateWithDuration:0.25 animations:^{
? ? ? ? ? ??
? ? ? ? ? ? _mainView.frame = self.view.bounds;
? ? ? ? }];
? ? }
? ??
? ??
? ? CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
? ??
? ? CGFloat target = 0;
? ? if (_mainView.frame.origin.x > screenW * 0.5) { // 定位到右邊
? ? ? ? target = HMRTarget;
? ? }else if (CGRectGetMaxX(_mainView.frame) < screenW * 0.5) { // 定位到左邊
? ? ? ? target = HMLTarget;
? ? }
? ??
? ? [UIView animateWithDuration:0.25 animations:^{
? ? ? ??
? ? ? ? if (target) { // 在需要定位左邊或者右邊
? ? ? ? ? ??
? ? ? ? ? ? // 獲取x軸偏移量
? ? ? ? ? ? CGFloat offsetX = target - _mainView.frame.origin.x;
? ? ? ? ? ??
? ? ? ? ? ? // 設(shè)置當(dāng)前主視圖的frame
? ? ? ? ? ? _mainView.frame = [self getCurrentFrameWithOffsetX:offsetX];
? ? ? ? ? ??
? ? ? ? }else{ // 還原
? ? ? ? ? ? _mainView.frame = self.view.bounds;
? ? ? ? }
? ? }];
? ??
? ? _isDraging = NO;
? ??
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS復(fù)數(shù)cell下優(yōu)雅的代碼結(jié)構(gòu)詳解

    iOS復(fù)數(shù)cell下優(yōu)雅的代碼結(jié)構(gòu)詳解

    這篇文章主要給大家介紹了關(guān)于iOS復(fù)數(shù)cell下優(yōu)雅的代碼結(jié)構(gòu)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • iOS 請求權(quán)限封裝類的實(shí)例代碼

    iOS 請求權(quán)限封裝類的實(shí)例代碼

    下面小編就為大家分享一篇iOS 請求權(quán)限封裝類的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS應(yīng)用開發(fā)中使UITextField實(shí)現(xiàn)placeholder屬性的方法

    iOS應(yīng)用開發(fā)中使UITextField實(shí)現(xiàn)placeholder屬性的方法

    這篇文章主要介紹了iOS應(yīng)用開發(fā)中使UITextField實(shí)現(xiàn)placeholder屬性的方法,示例代碼為傳統(tǒng)的Objective-C語言,需要的朋友可以參考下
    2016-04-04
  • iOS消息發(fā)送和轉(zhuǎn)發(fā)示例詳解

    iOS消息發(fā)送和轉(zhuǎn)發(fā)示例詳解

    這篇文章主要給大家介紹了關(guān)于iOS消息發(fā)送和轉(zhuǎn)發(fā)的相關(guān)資料,用Objective-C的術(shù)語來講,這叫做“給某個(gè)對象發(fā)送某條消息”。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • iOS開發(fā)學(xué)習(xí)TableView展現(xiàn)一個(gè)list實(shí)例

    iOS開發(fā)學(xué)習(xí)TableView展現(xiàn)一個(gè)list實(shí)例

    這篇文章主要為大家介紹了iOS系列學(xué)習(xí)TableView展現(xiàn)一個(gè)list實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 最新評論