從BiliBili開(kāi)源代碼看到自己的不足

Github地址

1.注釋明晰

/** 來(lái)瘋直播Session */
@property (nonatomic, strong) LFLiveSession *session;

/** 覆蓋層View */
@property (weak, nonatomic) IBOutlet UIView *overlayView;

/** 頭像imageView */
@property (weak, nonatomic) IBOutlet UIImageView *iconImageView;

/** 標(biāo)題標(biāo)簽 */
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;

/** 直播狀態(tài)標(biāo)簽 */
@property (weak, nonatomic) IBOutlet UILabel *liveStatusLabel;

/** 開(kāi)始直播按鈕 */
@property (weak, nonatomic) IBOutlet UIButton *startLiveBtn;

/** 相機(jī)按鈕 */
@property (weak, nonatomic) IBOutlet UIButton *cameraBtn;

/** 美顏按鈕 */
@property (weak, nonatomic) IBOutlet UIButton *beautyBtn;

/** 我是燈泡 []~( ̄▽?zhuān)?~* */
@property (weak, nonatomic) IBOutlet UIButton *lightBtn;

/** 燈泡狀態(tài),默認(rèn)為關(guān)閉 */
@property (nonatomic) AVCaptureTorchMode torchMode;

/** 我是鏡子 []~( ̄▽?zhuān)?~* */
@property (weak, nonatomic) IBOutlet UIButton *mirrorBtn;

2.多情況判斷枚舉

typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {
    AVAuthorizationStatusNotDetermined = 0,
    AVAuthorizationStatusRestricted,
    AVAuthorizationStatusDenied,
    AVAuthorizationStatusAuthorized
} NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

switch (status) {
        case AVAuthorizationStatusNotDetermined: {
            // 許可對(duì)話沒(méi)有出現(xiàn)芭概,發(fā)起授權(quán)許可
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
                if (granted) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        @strongify(self);
                        [self.session setRunning:YES];
                    });
                }
            }];
            break;
        }
        case AVAuthorizationStatusAuthorized: {
            // 已經(jīng)開(kāi)啟授權(quán)虐急,可繼續(xù)
            dispatch_async(dispatch_get_main_queue(), ^{
                @strongify(self);
                [self.session setRunning:YES];
            });
            break;
        }
        case AVAuthorizationStatusDenied:
        case AVAuthorizationStatusRestricted:
            // 用戶(hù)明確地拒絕授權(quán)虐骑,或者相機(jī)設(shè)備無(wú)法訪問(wèn)
            
            break;
        default:
            break;
    }

4.自定義打印

#define YPLog(FORMAT, ...) fprintf(stderr, "[%s:%d行] %s\n", [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

5.自定義常用語(yǔ)句和常用配置

#define YPNotificationCenter [NSNotificationCenter defaultCenter]
#define YPUserDefaults [NSUserDefaults standardUserDefaults]
#define YPApplication [UIApplication sharedApplication]
#define YPFileManager [NSFileManager defaultManager]
#define YPDevice [UIDevice currentDevice]
/**
*顏色
*/
#define YPBlackColor [UIColor blackColor]
#define YPBlueColor [UIColor blueColor]
#define YPRedColor [UIColor redColor]
#define YPWhiteColor [UIColor whiteColor]
/**
*隨機(jī)色和RGB
*/
/** RGB顏色 */
#define YPColor_RGB(r, g, b) [UIColor colorWithRed:(r) / 255.0 green:(g) / 255.0 blue:(b) / 255.0 alpha:1.0]
#define YPColor_RGBA(r, g, b, a) [UIColor colorWithRed:(r) / 255.0 green:(g) / 255.0 blue:(b) / 255.0 alpha:(a)]
#define YPColor_RGBA_256(r, g, b, a) [UIColor colorWithRed:(r) / 255.0 green:(g) / 255.0 blue:(b) / 255.0 alpha:(a) / 255.0]
/** 隨機(jī)色 */
#define YPRandomColor_RGB YPColor_RGB(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256))
#define YPRandomColor_RGBA YPColor_RGBA_256(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256))

6.判斷設(shè)備類(lèi)型

#define iPHone6Plus ([UIScreen mainScreen].bounds.size.height == 736) ? YES : NO

#define iPHone6 ([UIScreen mainScreen].bounds.size.height == 667) ? YES : NO

#define iPHone5 ([UIScreen mainScreen].bounds.size.height == 568) ? YES : NO

#define iPHone4 ([UIScreen mainScreen].bounds.size.height == 480) ? YES : NO

7.屏幕尺寸相關(guān)

/** 屏幕 */
#define YPScreen [UIScreen mainScreen]
/** 屏幕寬度 */
#define YPScreenW [UIScreen mainScreen].bounds.size.width
/** 屏幕高度 */
#define YPScreenH [UIScreen mainScreen].bounds.size.height
/** 屏幕bounds */
#define YPScreenBounds [UIScreen mainScreen].bounds
/** 屏幕伸縮度(Retina時(shí)值為2,非Retina值為1)*/
#define YPScreenScale [UIScreen mainScreen].scale

8.系統(tǒng)其它高度設(shè)置


/** 系統(tǒng)狀態(tài)欄高度 */
UIKIT_EXTERN CGFloat const kAppStatusBarHeight;
/** 系統(tǒng)導(dǎo)航欄高度 */
UIKIT_EXTERN CGFloat const kAppNavigationBarHeight;
/** 系統(tǒng)tabbar高度 */
UIKIT_EXTERN CGFloat const kAppTabBarHeight;

9.善于使用Layer

// containerView
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, YPScreenW, self.containerView.height) byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(8, 8)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = CGRectMake(0, 0, YPScreenW, self.containerView.height);
    maskLayer.path = maskPath.CGPath;
    self.containerView.layer.mask = maskLayer;

10.善于使用分類(lèi)擴(kuò)展方法

 // 我要直播按鈕
    [[_phoneLiveBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        @strongify(self);
        // 跳轉(zhuǎn)到手機(jī)直播控制器
        [self.navigationController pushViewController:[YPPhoneLiveViewController controller] animated:YES];
    }];

11.攔截push事件

/**
 * 可以在這個(gè)方法中攔截所有push進(jìn)來(lái)的控制器
 */
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.childViewControllers.count > 0) { // 如果push進(jìn)來(lái)的不是第一個(gè)控制器
        
        if ([viewController isKindOfClass:NSClassFromString(@"YPBilibiliWebViewController")]) {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
            button.titleLabel.font = [UIFont boldSystemFontOfSize:17];
            button.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0);
            [button setTitle:@"返回" forState:UIControlStateNormal];
            [button sizeToFit];
            [button setTitleColor:YPMainColor forState:UIControlStateNormal];
            [button setTitleColor:YPMainColor forState:UIControlStateHighlighted];
            @weakify(self);
            [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
                @strongify(self);
                [self popViewControllerAnimated:YES];
            }];
            
            viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
        }
        

        // 隱藏tabbar
        viewController.hidesBottomBarWhenPushed = YES;
    }
    
    // 這句super的push要放在后面, 讓viewController可以覆蓋上面設(shè)置的leftBarButtonItem
    [super pushViewController:viewController animated:animated];
    
}

12.善于封裝方法

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.delegate = self;
    
    self.tabBar.tintColor = YPMainColor;
    
    [self addChildVc:[YPHomeController controller] andTitle:@"首頁(yè)" andImage:@"home_home_tab" andSelectedImage:@"home_home_tab_s"];
    
    [self addChildVc:[YPProfileViewController controller] andTitle:@"我的" andImage:@"home_mine_tab" andSelectedImage:@"home_mine_tab_s"];
}

- (void)viewWillAppear:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
}


#pragma mark - Private
- (void)addChildVc:(UIViewController*)childVc andTitle:(NSString*)title andImage:(NSString*)image andSelectedImage:(NSString*)selectedImage
{
    childVc.tabBarItem.title = title;
    
    childVc.tabBarItem.image = [[UIImage imageNamed:image] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    
    YPNavigationController* nav = [[YPNavigationController alloc] initWithRootViewController:childVc];
    [self addChildViewController:nav];
}

13.善于封裝ViewDidLoad中的工作

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // UI
    [self createUI];
    
    // Data
    [self loadData];
}

14.不避諱使用通知换途,該用則用.用則有良好封裝

[[YPNotificationCenter rac_addObserverForName:kCycleBannerWillBeginDraggingNotification object:nil] subscribeNext:^(id x) {
        @strongify(self);
        self.contentTableView.scrollEnabled = NO;
    }];

15.將Xib約束拉出來(lái)掀潮,代碼中靈活使用

_coverImageViewHeightCons.constant = height;
[self layoutIfNeeded];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洪己,隨后出現(xiàn)的幾起案子耘戚,更是在濱河造成了極大的恐慌,老刑警劉巖本涕,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件业汰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡菩颖,警方通過(guò)查閱死者的電腦和手機(jī)样漆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晦闰,“玉大人放祟,你說(shuō)我怎么就攤上這事∩胗遥” “怎么了跪妥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)声滥。 經(jīng)常有香客問(wèn)我眉撵,道長(zhǎng),這世上最難降的妖魔是什么落塑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任纽疟,我火速辦了婚禮,結(jié)果婚禮上憾赁,老公的妹妹穿的比我還像新娘污朽。我一直安慰自己,他們只是感情好龙考,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布蟆肆。 她就那樣靜靜地躺著,像睡著了一般晦款。 火紅的嫁衣襯著肌膚如雪炎功。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天柬赐,我揣著相機(jī)與錄音亡问,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛州藕,可吹牛的內(nèi)容都是我干的束世。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼床玻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼毁涉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锈死,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贫堰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后待牵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體其屏,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年缨该,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偎行。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贰拿,死狀恐怖蛤袒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膨更,我是刑警寧澤妙真,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站荚守,受9級(jí)特大地震影響珍德,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矗漾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一菱阵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缩功,春花似錦、人聲如沸都办。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)琳钉。三九已至势木,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歌懒,已是汗流浹背啦桌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甫男。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓且改,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親板驳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子又跛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜若治,今天將帶大家一窺iOS動(dòng)畫(huà)全貌慨蓝。在這里你可以看...
    F麥子閱讀 5,096評(píng)論 5 13
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜端幼,今天將帶大家一窺ios動(dòng)畫(huà)全貌礼烈。在這里你可以看...
    每天刷兩次牙閱讀 8,465評(píng)論 6 30
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評(píng)論 25 707
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,125評(píng)論 29 470
  • 2006年,全國(guó)興起加盟創(chuàng)業(yè)風(fēng)暴婆跑。 因前期一直關(guān)注真皮包保養(yǎng)此熬、皮鞋美容、修鞋洽蛀、洗鞋項(xiàng)目摹迷,毅然在不懂技術(shù)...
    白駒過(guò)隙_e55d閱讀 258評(píng)論 0 4