最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS抽屜效果開(kāi)發(fā)案例分享

 更新時(shí)間:2016年04月08日 14:43:51   作者:神戶牛肉  
這篇文章主要為大家分享了iOS抽屜效果開(kāi)發(fā)案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了iOS抽屜效果開(kāi)發(fā)實(shí)例,供大家參考,具體內(nèi)容如下

在顯示在窗口的控制器上添加三個(gè)view(如果只需要往一邊滑動(dòng)就只加2個(gè)view)

先聲明三個(gè)view

#import "ViewController.h"
 
@interface ViewController ()
@property(nonatomic, weak) UIView *mainV;
@property(nonatomic, weak) UIView *leftV;
@property(nonatomic, weak) UIView *rightV;
@end

添加view到控制器view上

#pragma mark - 添加子控件
- (void)setUpChildViews {  
 UIView *leftV = [[UIView alloc]initWithFrame:self.view.bounds];  
 leftV.backgroundColor = [UIColor orangeColor];  
 [self.view addSubview:leftV];  
 _leftV = leftV;  
 UIView *rightV = [[UIView alloc]initWithFrame:self.view.bounds];  
 rightV.backgroundColor = [UIColor groupTableViewBackgroundColor];  
 [self.view addSubview:rightV];  
 _rightV = rightV;  
 UIView *mainV = [[UIView alloc]initWithFrame:self.view.bounds];  
 mainV.backgroundColor = [UIColor yellowColor];  
 [self.view addSubview:mainV];  
 _mainV = mainV;
}
 
- (void)viewDidLoad {
 [super viewDidLoad];
  
 //添加子控件
 [self setUpChildViews];
  
 //添加Pan手勢(shì)
 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)];
  
 [self.view addGestureRecognizer:pan];
  
 //添加點(diǎn)按手勢(shì),在主視圖上任意位置點(diǎn)擊回到屏幕開(kāi)始位置
 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
  
 [self.view addGestureRecognizer:tap];
  
}
#pragma mark - 手勢(shì)識(shí)別方法
#define targetL -230
#define targetR 200
#define screenW [UIScreen mainScreen].bounds.size.width
- (void)pan:(UIPanGestureRecognizer *)pan {
  
 //獲取手勢(shì)移動(dòng)的位置
 CGPoint tranP = [pan translationInView:self.view];
  
 //獲取x的偏移量
 CGFloat offsetX = tranP.x;
  
 //修改mainV的frame
 _mainV.frame = [self frameWithOffsetX:offsetX];
  
 //判斷mainV的x是否大于0
 [self observeValueForKeyPath:nil ofObject:nil change:nil context:nil];
  
 //復(fù)位
 [pan setTranslation:CGPointZero inView:self.view];
  
 //判斷當(dāng)手勢(shì)結(jié)束的時(shí)候,定位
 if (pan.state == UIGestureRecognizerStateEnded) {
   
  CGFloat target = 0;
   
  if (_mainV.frame.origin.x > screenW * 0.5) {
   //定位到右邊
   target = targetR;
  }else if(CGRectGetMaxX(_mainV.frame) < screenW * 0.5) {
   //定位到左邊
   target = targetL;
  }
   
  //獲取X軸需要移動(dòng)的偏移量
  CGFloat offsetX = target - _mainV.frame.origin.x;
   
  [UIView animateWithDuration:0.25 animations:^{
    
   _mainV.frame = target == 0 ? self.view.bounds : [self frameWithOffsetX:offsetX];
 
  }];
   
 }
  
}
- (void)tap {
  
 [UIView animateWithDuration:0.25 animations:^{
  _mainV.frame = self.view.bounds;
 }];
  
}

#define kMaxY 80
#pragma mark - 根據(jù)offsetX計(jì)算mainV的frame
- (CGRect)frameWithOffsetX:(CGFloat)offsetX {
  
 //獲取上一次的frame
 CGRect frame = _mainV.frame;
  
 //獲取屏幕的高度
 CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
  
 //獲取屏幕的寬度
 //CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
  
 //X軸平移一點(diǎn)對(duì)應(yīng)Y軸需要平移的距離
 CGFloat offsetY = offsetX * kMaxY / screenW;
  
 //獲取上一次的高度
 CGFloat preH = frame.size.height;
  
 //獲取上一次的寬度
 CGFloat preW = frame.size.width;
  
 //獲取當(dāng)前高度
 CGFloat curH = preH - 2 * offsetY;
 //如果是向左滑動(dòng)
 if(frame.origin.x < 0) {
  curH = preH + 2 * offsetY;
 }
  
 //獲取尺寸的縮放比例
 CGFloat scale = curH / preH;
  
 //獲取當(dāng)前寬度
 CGFloat curW = preW * scale;
  
 //獲取當(dāng)前x
 frame.origin.x += offsetX;
  
 //獲取當(dāng)前y
 CGFloat y = (screenH - curH) / 2;
 frame.origin.y = y;
  
 frame.size.width = curW;
 frame.size.height = curH;
  
 return frame;
  
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
  
 if(_mainV.frame.origin.x > 0) {//往右邊滑動(dòng)
  _rightV.hidden = YES;
 }else if(_mainV.frame.origin.x < 0) {//往左邊滑動(dòng)
  _rightV.hidden = NO;
 }
  
}

如果想要在mainV主視圖中顯示tableView,就新創(chuàng)建一個(gè)TableViewController,在這里面顯示tableView的數(shù)據(jù),

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 
 return 30;
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  
  
 static NSString *ID = @"cell";
  
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  
 if(cell == nil) {
  cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
 }
  
 cell.textLabel.text = [NSString stringWithFormat:@"第%ld行", indexPath.row];
  
 return cell;
}

再創(chuàng)建一個(gè)在storyboard中顯示的控制器XXMainViewController,繼承自實(shí)現(xiàn)了抽屜效果的ViewController,并且在storyboard中將class改為這個(gè)控制的類名,還要將顯示tableView的控制成為他的子控制器

- (void)viewDidLoad {
 [super viewDidLoad];
  
 XXViewController *vc = [[XXViewController alloc]init];
 vc.view.frame = self.view.bounds;
  
 //讓vc成為主視圖控制器的子控制器
 [self addChildViewController:vc];
  
 //主視圖展示tableView
 [self.mainV addSubview:vc.view];
  
}

為了在XXMainViewController中只能訪問(wèn)mainV而不能修改他的值,所以將子控件的view暴露在ViewController.h中,并添加read-only

#import <UIKit/UIKit.h>
 
@interface ViewController : UIViewController
@property(nonatomic, weak, readonly) UIView *mainV;
@property(nonatomic, weak, readonly) UIView *leftV;
@property(nonatomic, weak, readonly) UIView *rightV;
@end

運(yùn)行效果圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)iOS程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • ios12中遇到的帶input彈窗的錯(cuò)位問(wèn)題的解決方法

    ios12中遇到的帶input彈窗的錯(cuò)位問(wèn)題的解決方法

    這篇文章主要介紹了ios12中遇到的帶input彈窗的錯(cuò)位問(wèn)題的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • iOS ScrollView實(shí)現(xiàn)自動(dòng)布局的方法(適用Swift 3.0 )

    iOS ScrollView實(shí)現(xiàn)自動(dòng)布局的方法(適用Swift 3.0 )

    傳說(shuō)中有一個(gè)美工ios開(kāi)發(fā)者在遇到這個(gè)問(wèn)題的時(shí)候特意跑到蘋果總部去咨詢?nèi)绾螌?duì)scrollview進(jìn)行自動(dòng)布局。當(dāng)然大家不用去了,下面這篇文章就來(lái)給大家介紹關(guān)于iOS ScrollView實(shí)現(xiàn)自動(dòng)布局的方法,文中的語(yǔ)法同樣也適用Swift 3.0 ,需要的朋友可以參考下。
    2017-12-12
  • iOS模塊化開(kāi)發(fā)淺析

    iOS模塊化開(kāi)發(fā)淺析

    本文給大家分析了IOS在模塊發(fā)開(kāi)發(fā)時(shí)候的相關(guān)注意點(diǎn)以及簡(jiǎn)單代碼做了分享,有興趣的朋友參考學(xué)習(xí)下。
    2018-04-04
  • iOS開(kāi)發(fā)中UIImageView控件的常用操作整理

    iOS開(kāi)發(fā)中UIImageView控件的常用操作整理

    這篇文章主要介紹了iOS開(kāi)發(fā)中UIImageView控件的常用操作整理,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-01-01
  • IOS中獲取本地通訊錄聯(lián)系人以及漢字首字母排序

    IOS中獲取本地通訊錄聯(lián)系人以及漢字首字母排序

    這篇文章主要介紹了IOS中獲取本地通訊錄聯(lián)系人以及漢字首字母排序的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 淺談iOS中三種生成隨機(jī)數(shù)方法

    淺談iOS中三種生成隨機(jī)數(shù)方法

    本文給大家分享的是在IOS中生成隨機(jī)數(shù)的三種方法,以及三種算法的效率對(duì)比,有需要的小伙伴可以參考下。
    2015-06-06
  • iOS指紋驗(yàn)證TouchID應(yīng)用學(xué)習(xí)教程2

    iOS指紋驗(yàn)證TouchID應(yīng)用學(xué)習(xí)教程2

    這篇文章主要為大家詳細(xì)iOS指紋驗(yàn)證TouchID應(yīng)用學(xué)習(xí)教程的第一篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • iOS 高效的分頁(yè)加載實(shí)現(xiàn)示例

    iOS 高效的分頁(yè)加載實(shí)現(xiàn)示例

    本篇文章主要介紹了iOS 高效的分頁(yè)加載實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • ios實(shí)現(xiàn)簡(jiǎn)易隊(duì)列

    ios實(shí)現(xiàn)簡(jiǎn)易隊(duì)列

    這篇文章主要為大家詳細(xì)介紹了ios實(shí)現(xiàn)簡(jiǎn)易隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 淺談SwiftUI 里面$0是什么意思如何用

    淺談SwiftUI 里面$0是什么意思如何用

    這篇文章主要介紹了淺談SwiftUI 里面$0是什么意思如何用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評(píng)論

长宁县| 思茅市| 无锡市| 托克逊县| 绥宁县| 莱阳市| 曲水县| 盐津县| 响水县| 石门县| 巧家县| 体育| 樟树市| 甘孜县| 桐庐县| 汉川市| 通海县| 永登县| 周至县| 上栗县| 松阳县| 石楼县| 灯塔市| 梁河县| 秦安县| 宜宾市| 北流市| 哈尔滨市| 葫芦岛市| 彩票| 玉林市| 宝坻区| 石棉县| 游戏| 青州市| 灌南县| 榕江县| 河池市| 迁安市| 镇赉县| 丰顺县|