310 lines
13 KiB
Objective-C
310 lines
13 KiB
Objective-C
//
|
|
// UIViewController+UMComAddition.m
|
|
// UMCommunity
|
|
//
|
|
// Created by umeng on 15/5/8.
|
|
// Copyright (c) 2015年 Umeng. All rights reserved.
|
|
//
|
|
|
|
#import "UIViewController+UMComAddition.h"
|
|
#import "UMComResouceDefines.h"
|
|
#import <objc/runtime.h>
|
|
#import "UMComBarButtonItem.h"
|
|
#import <UMComFoundation/UMComKit+Color.h>
|
|
|
|
const char kTopTipLabelKey;
|
|
|
|
const char kAnimating;
|
|
|
|
@implementation UIViewController (UMComAddition)
|
|
|
|
|
|
- (void)setBackButtonWithTitle:(NSString *)title
|
|
{
|
|
if ([[UIDevice currentDevice].systemVersion floatValue] < 7.0 || self.navigationController.viewControllers.count == 1) {
|
|
self.navigationController.navigationItem.leftBarButtonItem = nil;
|
|
UIBarButtonItem *backButtonItem = [[UMComBarButtonItem alloc] initWithTitle:title target:self action:@selector(goBack)];
|
|
backButtonItem.customView.frame = CGRectMake(0, 0, 40, 35);
|
|
self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
}
|
|
}
|
|
|
|
- (void)setBackButtonWithImage
|
|
{
|
|
if ([[UIDevice currentDevice].systemVersion floatValue] < 7.0 || self.navigationController.viewControllers.count <= 1) {
|
|
self.navigationController.navigationItem.leftBarButtonItem = nil;
|
|
UMComBarButtonItem *backButtonItem = [[UMComBarButtonItem alloc] initWithNormalImageName:@"Backx" target:self action:@selector(goBack)];
|
|
backButtonItem.customView.frame = CGRectMake(0, 0, 40, 35);
|
|
backButtonItem.customButtonView.frame = CGRectMake(5, 0, 20, 20);
|
|
self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
}
|
|
}
|
|
|
|
- (void)setBackButtonWithImage:(UIImage*)image
|
|
{
|
|
if ([[UIDevice currentDevice].systemVersion floatValue] < 7.0 || self.navigationController.viewControllers.count <= 1) {
|
|
self.navigationController.navigationItem.leftBarButtonItem = nil;
|
|
UMComBarButtonItem *backButtonItem = [[UMComBarButtonItem alloc] initWithNormalImage:image target:self action:@selector(goBack)];
|
|
backButtonItem.customView.frame = CGRectMake(0, 0, 40, 35);
|
|
backButtonItem.customButtonView.frame = CGRectMake(5, 0, 20, 20);
|
|
self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
}
|
|
}
|
|
|
|
- (void)setLeftButtonWithTitle:(NSString *)title action:(SEL)action
|
|
{
|
|
UIBarButtonItem *backButtonItem = [[UMComBarButtonItem alloc] initWithTitle:title target:self action:@selector(action)];
|
|
backButtonItem.customView.frame = CGRectMake(0, 0, 40, 35);
|
|
self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
}
|
|
|
|
- (void)setLeftButtonWithImageName:(NSString *)imageName action:(SEL)action
|
|
{
|
|
|
|
[self setBackButtonWithImageName:imageName buttonSize:CGSizeMake(20, 20) action:action];
|
|
}
|
|
|
|
- (void)setBackButtonWithImageName:(NSString *)imageName buttonSize:(CGSize)size action:(SEL)action
|
|
{
|
|
UMComBarButtonItem *backButtonItem = [[UMComBarButtonItem alloc] initWithNormalImageNameWithBackItem:imageName target:self action:@selector(goBack)];
|
|
|
|
if (!backButtonItem) {
|
|
NSLog(@"backButtonItem must not nil");
|
|
return;
|
|
}
|
|
|
|
backButtonItem.customView.frame = CGRectMake(0, 0, size.width + 10 , size.height);
|
|
backButtonItem.customButtonView.frame = CGRectMake(10, 0, size.width, size.height);
|
|
//self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
//通过设置leftBarButtonItems中一个固定偏移来设置左边返回按钮的点击返回,让用户方便点击
|
|
if ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]< 8) {
|
|
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
|
|
negativeSpacer.width = -10;
|
|
self.navigationItem.leftBarButtonItems = @[negativeSpacer, backButtonItem];
|
|
}else{
|
|
//在IOS8.0以上把返回按钮的坐标设置为0
|
|
CGRect backButtonRC = backButtonItem.customButtonView.frame;
|
|
backButtonRC.origin.x = 0;
|
|
backButtonItem.customButtonView.frame = backButtonRC;
|
|
self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
}
|
|
}
|
|
|
|
- (void)setLeftButtonWithImage:(UIImage*)image action:(SEL)action
|
|
{
|
|
[self setBackButtonWithImage:image buttonSize:CGSizeMake(20, 20) action:action];
|
|
}
|
|
|
|
- (void)setBackButtonWithImage:(UIImage*)image buttonSize:(CGSize)size action:(SEL)action
|
|
{
|
|
UMComBarButtonItem *backButtonItem = [[UMComBarButtonItem alloc] initWithNormalImageWithBackItem:image target:self action:@selector(goBack)];
|
|
|
|
if (!backButtonItem) {
|
|
NSLog(@"backButtonItem must not nil");
|
|
return;
|
|
}
|
|
|
|
backButtonItem.customView.frame = CGRectMake(0, 0, size.width + 10 , size.height);
|
|
backButtonItem.customButtonView.frame = CGRectMake(10, 0, size.width, size.height);
|
|
//self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
//通过设置leftBarButtonItems中一个固定偏移来设置左边返回按钮的点击返回,让用户方便点击
|
|
if ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]< 8) {
|
|
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
|
|
negativeSpacer.width = -10;
|
|
self.navigationItem.leftBarButtonItems = @[negativeSpacer, backButtonItem];
|
|
}else{
|
|
//在IOS8.0以上把返回按钮的坐标设置为0
|
|
CGRect backButtonRC = backButtonItem.customButtonView.frame;
|
|
backButtonRC.origin.x = 0;
|
|
backButtonItem.customButtonView.frame = backButtonRC;
|
|
self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
}
|
|
}
|
|
|
|
- (void)setRightButtonWithTitle:(NSString *)title action:(SEL)action
|
|
{
|
|
UIBarButtonItem *rightButtonItem = [[UMComBarButtonItem alloc] initWithTitle:title target:self action:action];
|
|
rightButtonItem.customView.frame = CGRectMake(0, 0, 40, 35);
|
|
self.navigationItem.rightBarButtonItem = rightButtonItem;
|
|
}
|
|
|
|
- (void)setRightButtonWithImageName:(NSString *)imageName action:(SEL)action
|
|
{
|
|
UMComBarButtonItem *rightButtonItem = [[UMComBarButtonItem alloc] initWithNormalImageName:imageName target:self action:action];
|
|
self.navigationItem.rightBarButtonItem = rightButtonItem;
|
|
}
|
|
|
|
- (void)setRightButtonWithImage:(UIImage *)image action:(SEL)action
|
|
{
|
|
UMComBarButtonItem *rightButtonItem = [[UMComBarButtonItem alloc] initWithNormalImage:image target:self action:action];
|
|
self.navigationItem.rightBarButtonItem = rightButtonItem;
|
|
}
|
|
|
|
- (void)setTitleViewWithTitle:(NSString *)title
|
|
{
|
|
[self setForumUITitle:title];
|
|
// [self setTitle:title font:UMComFontNotoSansLightWithSafeSize(18) titleColor:[UIColor blackColor]];
|
|
}
|
|
|
|
- (void)setForumUITitle:(NSString *)title
|
|
{
|
|
[self setTitle:title font:UMComFontNotoSansLightWithSafeSize(UMCom_ForumUI_Title_Font) titleColor:UMComColorWithHexString(UMCom_ForumUI_Title_Color)];
|
|
}
|
|
|
|
- (void)setTitle:(NSString *)title font:(UIFont *)font titleColor:(UIColor *)color
|
|
{
|
|
UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 0, self.view.frame.size.width-200, 100)];
|
|
titleLabel.textAlignment = NSTextAlignmentCenter;
|
|
titleLabel.backgroundColor = [UIColor clearColor];
|
|
titleLabel.font = font;
|
|
titleLabel.text= title;
|
|
titleLabel.textColor = color;
|
|
[self.navigationItem setTitleView:titleLabel];
|
|
}
|
|
|
|
- (void)setForumUIBackButton
|
|
{
|
|
[self setBackButtonWithImageName:@"um_forum_back_gray" buttonSize:CGSizeMake(10, 19) action:@selector(goBack)];
|
|
}
|
|
|
|
- (void)setForumUIBackButtonWithImage:(UIImage*)image
|
|
{
|
|
[self setBackButtonWithImage:image buttonSize:CGSizeMake(10, 19) action:@selector(goBack)];
|
|
}
|
|
|
|
- (void)goBack
|
|
{
|
|
if (self.navigationController.viewControllers.count > 1) {
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
}else{
|
|
[self dismissViewControllerAnimated:YES completion:^{
|
|
|
|
}];
|
|
}
|
|
}
|
|
|
|
- (void)showTipLableFromTopWithTitle:(NSString *)title
|
|
{
|
|
UILabel *tipLabel = objc_getAssociatedObject(self, &kTopTipLabelKey);//[self creatTipLabelWithTitle:title];
|
|
if (!tipLabel) {
|
|
tipLabel = [self creatTipLabel];
|
|
tipLabel.backgroundColor = UMComColorWithHexString(FontColorBlue);
|
|
tipLabel.textColor = [UIColor whiteColor];
|
|
objc_setAssociatedObject(self, &kTopTipLabelKey, tipLabel, OBJC_ASSOCIATION_ASSIGN);
|
|
}
|
|
tipLabel.text = title;
|
|
tipLabel.frame = CGRectMake(0, -40, tipLabel.frame.size.width, tipLabel.frame.size.height);
|
|
[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
|
|
tipLabel.frame = CGRectMake(0, 0, tipLabel.frame.size.width, tipLabel.frame.size.height);
|
|
} completion:^(BOOL finished) {
|
|
[UIView animateWithDuration:0.5 delay:1 options:UIViewAnimationOptionCurveEaseOut animations:^{
|
|
tipLabel.frame = CGRectMake(0, -40, tipLabel.frame.size.width, tipLabel.frame.size.height);
|
|
} completion:^(BOOL finished) {
|
|
|
|
}];
|
|
}];
|
|
}
|
|
|
|
- (UILabel *)creatTipLabel
|
|
{
|
|
UILabel *tipLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, -40, self.view.frame.size.width, 40)];
|
|
tipLabel.backgroundColor = [UIColor clearColor];
|
|
tipLabel.textColor = [UIColor blackColor];
|
|
tipLabel.alpha = 0.8;
|
|
tipLabel.font = UMComFontNotoSansLightWithSafeSize(16);
|
|
tipLabel.textAlignment = NSTextAlignmentCenter;
|
|
[self.view addSubview:tipLabel];
|
|
return tipLabel;
|
|
}
|
|
|
|
- (void)transitionFromViewControllerAtIndex:(NSInteger)fromIndex toViewControllerAtIndex:(NSInteger)toIndex duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^ __nullable)(void))animations completion:(void (^ __nullable)(BOOL finished))completion
|
|
{
|
|
if (fromIndex >= self.childViewControllers.count || toIndex >= self.childViewControllers.count) {
|
|
NSLog(@"index is beyond self.childViewControllers.count");
|
|
if (completion) {
|
|
completion(YES);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (fromIndex == toIndex) {
|
|
if (completion) {
|
|
completion(YES);
|
|
}
|
|
return;
|
|
}
|
|
// __block NSNumber *isAnimating = objc_getAssociatedObject(self, &kAnimating);//[self creatTipLabelWithTitle:title];
|
|
// if (isAnimating == nil) {
|
|
// isAnimating = [NSNumber numberWithBool:NO];
|
|
// objc_setAssociatedObject(self, &kAnimating, isAnimating, OBJC_ASSOCIATION_ASSIGN);
|
|
// }
|
|
// if ([isAnimating boolValue] == YES) {
|
|
// return;
|
|
// }
|
|
// isAnimating = [NSNumber numberWithBool:YES];
|
|
// objc_setAssociatedObject(self, &kAnimating, isAnimating, OBJC_ASSOCIATION_ASSIGN);
|
|
UIViewController *fromViewController = self.childViewControllers[fromIndex];
|
|
UIViewController *toViewController = self.childViewControllers[toIndex];
|
|
// __block CGPoint fromCenter = fromViewController.view.center;
|
|
// CGRect currentFrame = toViewController.view.frame;
|
|
// currentFrame.size.height = self.view.frame.size.height - currentFrame.origin.y;
|
|
// if (currentFrame.size.height != toViewController.view.frame.size.height) {
|
|
// toViewController.view.frame = currentFrame;
|
|
// }
|
|
|
|
// CGPoint toCenter = toViewController.view.center;
|
|
//// if (fromIndex == toIndex) {
|
|
// toCenter.x = self.view.frame.size.width/2;
|
|
// toViewController.view.center = toCenter;
|
|
// isAnimating = [NSNumber numberWithBool:NO];
|
|
// objc_setAssociatedObject(self, &kAnimating, isAnimating, OBJC_ASSOCIATION_ASSIGN);
|
|
// return;
|
|
// }
|
|
// if (toIndex > fromIndex) {
|
|
// if (toViewController.view.frame.origin.x <= 0) {
|
|
// toCenter.x = self.view.frame.size.width*3/2;
|
|
// toViewController.view.center = toCenter;
|
|
// }
|
|
// }else if(toIndex < fromIndex){
|
|
// if (toViewController.view.frame.origin.x >= 0) {
|
|
// toCenter.x = - self.view.frame.size.width*3/2;
|
|
// toViewController.view.center = toCenter;
|
|
// }
|
|
// }
|
|
// __weak typeof(self) weakSelf = self;
|
|
[self transitionFromViewController:fromViewController toViewController:toViewController duration:duration options:options animations:^{
|
|
// if (fromViewController == toViewController) {
|
|
// isAnimating = [NSNumber numberWithBool:YES];
|
|
// objc_setAssociatedObject(self, &kAnimating, isAnimating, OBJC_ASSOCIATION_ASSIGN);
|
|
// return ;
|
|
// }
|
|
// toViewController.view.center = CGPointMake(weakSelf.view.frame.size.width/2, toViewController.view.center.y);
|
|
// if (toIndex > fromIndex) {
|
|
// fromCenter.x = - weakSelf.view.frame.size.width*3/2;
|
|
// }else if(toIndex < fromIndex){
|
|
// fromCenter.x = weakSelf.view.frame.size.width*3/2;
|
|
// }
|
|
// fromViewController.view.center = fromCenter;
|
|
if (animations) {
|
|
animations();
|
|
}
|
|
} completion:^(BOOL finished) {
|
|
// isAnimating = [NSNumber numberWithBool:NO];
|
|
// objc_setAssociatedObject(self, &kAnimating, isAnimating, OBJC_ASSOCIATION_ASSIGN);
|
|
if (completion) {
|
|
completion(YES);
|
|
}
|
|
}];
|
|
}
|
|
|
|
- (void)transitionFromViewControllerAtIndex:(NSInteger)fromIndex
|
|
toViewControllerAtIndex:(NSInteger)toIndex
|
|
animations:(void (^ __nullable)(void))animations
|
|
completion:(void (^ __nullable)(BOOL finished))completion
|
|
{
|
|
[self transitionFromViewControllerAtIndex:fromIndex toViewControllerAtIndex:toIndex duration:0.1 options:UIViewAnimationOptionCurveEaseIn animations:animations completion:completion];
|
|
}
|
|
|
|
|
|
@end
|