ios 사 이 드 서랍 효과 구현 코드
효과 도 는 다음 과 같다
코드 실현 및 사고방식 아래 분석:
코드 생 성 내 비게 이 션 컨트롤 러
Appdelegate.m 중
#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
ViewController * vc = [[ViewController alloc] init];
//
UINavigationController * nav = [[UINavigationController alloc] initWithRootViewController:vc];
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}
viewcontroller.m 중
//
// ViewController.m
// PBSliedMenu
//
// Created by on 16/4/21.
// Copyright © 2016 . All rights reserved.
//
#import "ViewController.h"
#define kScreenH [UIScreen mainScreen].bounds.size.height
#define kScreenW [UIScreen mainScreen].bounds.size.width
#define kNavW 64
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic, strong) UITableView *tableView;
/** */
@property (nonatomic, assign) BOOL openSlide;
/** */
@property (nonatomic, strong) UIBarButtonItem *btnLeft;
@end
왼쪽 view 가 열 렸 는 지 닫 혔 는 지 bool 값 으로 기록 합 니 다.클릭 할 때마다 tableView 상 태 를 기록 하 는 값 을 변경 합 니 다.사 이 드 바 단 추 를 속성 으로 저장 합 니 다.왼쪽 tableView 가 팝 업 을 하거나 애니메이션 을 실행 하 는 과정 에서 사용 하지 않 습 니 다.
@implementation ViewController
#pragma mark - cell
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
NSLog(@"%@",cell.textLabel.text);
// cell
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
#pragma mark - tableView
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 20;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString * ID = @"cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:ID forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@" %zd",indexPath.row];
cell.backgroundColor = [UIColor orangeColor];
return cell;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self initLeftBarButton];
// cell
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
}
메모:cell 을 등록 하 는 동시에 self.tableView 를 호출 하면 게 으 른 로 딩 을 호출 합 니 다.이때 tableView 가 만 들 어 졌 습 니 다.먼저 만들어 야 합 니 다.그렇지 않 으 면 tableView 가 처음 팝 업 할 때 화면(0,0)점 에서 팝 업 됩 니 다.전체 tableView 가 왼쪽 에서 팝 업 되 는 것 이 아 닙 니 다.
#pragma mark -
-(void)initLeftBarButton{
UIButton * btnLeft = [[UIButton alloc] init];
btnLeft.frame = CGRectMake(0, 0, 90, 40);
[btnLeft setTitle:@" " forState:UIControlStateNormal];
[btnLeft setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btnLeft addTarget:self action:@selector(didLeftBtn) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btnLeft];
self.btnLeft = self.navigationItem.leftBarButtonItem;
}
#pragma mark - tableView
-(UITableView *)tableView{
if (_tableView == nil) {
_tableView = [[UITableView alloc] init];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.backgroundColor = [UIColor orangeColor];
// tableView , -- tableView
CGFloat hight = kScreenH;
CGFloat x = 0;
CGFloat y = kNavW;
CGFloat width = 0;
_tableView.frame = CGRectMake(x, y, width, hight);
//
_tableView.showsVerticalScrollIndicator = NO;
}
return _tableView;
}
게 으 름 피 울 때 tableView 를 직접 만 들 고 너비=0 을 만 들 면 됩 니 다.
#pragma mark - tableView
-(void)didLeftBtn{
// button button
self.btnLeft.enabled = NO;
CGFloat hight = kScreenH;
CGFloat x = 0;
CGFloat y = kNavW;
if (!self.openSlide) {
//
[UIView animateWithDuration:0.3 animations:^{
CGFloat width = kScreenW / 3;
self.tableView.frame = CGRectMake(x, y, width, hight);
}];
[self.view addSubview:self.tableView];
} else {
[UIView animateWithDuration:0.3 animations:^{
CGFloat width = 0;
self.tableView.frame = CGRectMake(x, y, width, hight);
}];
}
// button
[self performSelector:@selector(setBtnLeftEnabled) withObject:nil afterDelay:0.3];
//
if (self.openSlide == YES) {
self.openSlide = NO;
} else {
self.openSlide = YES;
}
}
사 이 드 바 단 추 를 누 르 면 tableView 를 팝 업 합 니 다.이 과정 에서 애니메이션 을 실행 하면 딱딱 해 보이 지 않 습 니 다.tableView 의 폭 을 0--->화면 너비 의 3 분 의 1 로 합 니 다.tableView 가 열 린 상 태 를 기록 합 니 다.
애니메이션 을 실행 하 는 과정 에서 사 이 드 바 단 추 를 사용 하지 않 습 니 다.코드 실행 시간 이 순간적으로 완성 되 었 기 때문에 애니메이션 실행 시간 은 0.3s 이 고 0.3s 가 지연 되 어 사 이 드 바 단 추 를 사용 하지 않 습 니 다.
// tableView
//#pragma mark - tableView
//-(void)removeSliedView{
//
// [self.tableView removeFromSuperview];
// self.btnLeft.enabled = YES;
//}
#pragma mark - " "
-(void)setBtnLeftEnabled{
self.btnLeft.enabled = YES;
// cell
self.tableView.contentOffset = CGPointMake(0, 0);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
이전에 실 수 를 한 적 이 있 습 니 다.사 이 드 바 단 추 를 누 르 면 tableView 를 만 들 고 tableView 를 없 애 는 것 을 누 르 면 성능 이 소 모 됩 니 다.게 으 른 로 딩 을 통 해 tableView 를 만 들 고 tableView 를 회수 할 때 너비=0 을 만 들 면 됩 니 다.위의 그림 에서 보 듯 이 tableView 를 미 끄 러 뜨 릴 때 tableView 를 다시 클릭 하거나 미 끄 러 지 는 위 치 를 클릭 하면 0 으로 표 시 된 cell 을 맨 위 에 표시 하 는 cell 로 복원 하지 않 습 니 다.최적화 방안:tableView 의 오프셋 contentOffset 을 0 으로 만 들 면 됩 니 다.코드 는 tableView 를 팝 업 하고 tableView 를 회수 하 는 애니메이션 코드 에 쓸 수 없습니다.애니메이션 이 실 행 된 후의 코드 에 쓰 여 있 기 때문이다.
소스 코드 주소:https://git.oschina.net/alexpei/PBSliedMenu.git
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.