IOS客户端Coding项目记录(五)
1:统一修改导航栏的样式,在 AppDelegate.m中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; //设置导航条样式 [self customizeInterface]; if ([Login isLogin]) { [self setupTabViewController]; }else{ [UIApplication sharedApplication].applicationIconBadgeNumber = 0; [self setupLoginViewController]; } [self.window makeKeyAndVisible]; return YES; } - (void)customizeInterface { //设置Nav的背景色和title色 UINavigationBar *navigationBarAppearance = [UINavigationBar appearance]; NSDictionary *textAttributes = nil; if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) { [navigationBarAppearance setTintColor:[UIColor whiteColor]];//返回按钮的箭头颜色 [[UITextField appearance] setTintColor:[UIColor colorWithHexString:@"0x3bbc79"]];//设置UITextField的光标颜色 [[UITextView appearance] setTintColor:[UIColor colorWithHexString:@"0x3bbc79"]];//设置UITextView的光标颜色 [[UISearchBar appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithHexString:@"0xe5e5e5"]] forBarPosition:0 barMetrics:UIBarMetricsDefault]; textAttributes = @{ NSFontAttributeName: [UIFont boldSystemFontOfSize:kNavTitleFontSize], NSForegroundColorAttributeName: [UIColor whiteColor], }; } else { #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0 [[UISearchBar appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithHexString:@"0xe5e5e5"]]]; textAttributes = @{ UITextAttributeFont: [UIFont boldSystemFontOfSize:kNavTitleFontSize], UITextAttributeTextColor: [UIColor whiteColor], UITextAttributeTextShadowColor: [UIColor clearColor], UITextAttributeTextShadowOffset: [NSValue valueWithUIOffset:UIOffsetZero], }; #endif } [navigationBarAppearance setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithHexString:@"0x28303b"]] forBarMetrics:UIBarMetricsDefault]; [navigationBarAppearance setTitleTextAttributes:textAttributes]; } 其中上面的版本判断: FOUNDATION_EXPORT double NSFoundationVersionNumber; #if TARGET_OS_IPHONE #define NSFoundationVersionNumber_iPhoneOS_2_0 678.24 #define NSFoundationVersionNumber_iPhoneOS_2_1 678.26 #define NSFoundationVersionNumber_iPhoneOS_2_2 678.29 #define NSFoundationVersionNumber_iPhoneOS_3_0 678.47 #define NSFoundationVersionNumber_iPhoneOS_3_1 678.51 #define NSFoundationVersionNumber_iPhoneOS_3_2 678.60 #define NSFoundationVersionNumber_iOS_4_0 751.32 #define NSFoundationVersionNumber_iOS_4_1 751.37 #define NSFoundationVersionNumber_iOS_4_2 751.49 #define NSFoundationVersionNumber_iOS_4_3 751.49 #define NSFoundationVersionNumber_iOS_5_0 881.00 #define NSFoundationVersionNumber_iOS_5_1 890.10 #define NSFoundationVersionNumber_iOS_6_0 992.00 #define NSFoundationVersionNumber_iOS_6_1 993.00 #define NSFoundationVersionNumber_iOS_7_0 1047.20 #define NSFoundationVersionNumber_iOS_7_1 1047.25 #endif
2:判断一张view 是否被加载过用 nil == view.superview
if (nil == view.superview) { //判断一个view 是否被加载过 如果被加载过,它的superview就不会是nil CGRect frame = scrollView0.frame; frame.origin.x = frame.size.width * page; frame.origin.y = 0; view.frame = frame; [scrollView0 addSubview:view]; }
3:百度地图初始化坐标范围
- (void)viewDidLoad { [super viewDidLoad]; [UIApplication sharedApplication].applicationIconBadgeNumber =15; _mapView=[[BMKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)]; BMKCoordinateRegion region; ////表示范围的结构体 region.center.latitude = 24.27;// 中心中 region.center.longitude = 118.06; region.span.latitudeDelta = 0.1;//经度范围(设置为0.1表示显示范围为0.2的纬度范围) region.span.longitudeDelta = 0.1;//纬度范围 [_mapView setRegion:region]; [self.baiduView addSubview:_mapView]; } 自定义大头针的图片: - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation { if ([annotation isKindOfClass:[BMKPointAnnotation class]]) { BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"]; newAnnotationView.pinColor = BMKPinAnnotationColorPurple; newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示 newAnnotationView.image = [UIImage imageNamed:@"iphone"]; //把大头针换成别的图片 return newAnnotationView; } return nil; }
4:隐藏键盘
当前视图上有多个uitextfield时,来隐藏键盘, 先遍历视图的所有子视图来 如果是UITextField就将其设为非第一响应 当然,如果要隐藏子视图上的UITextField的话可以进一步判断view的subviews的个数,如果大于1则遍历view的子视图,然后作类似操作 //隐藏键盘 当前视图上有多个uitextfield for(UIView *view in [self.view subviews]) { if(view is kindofclass:[UITextField Class]) { [view resignfirstrespond]; } } 直接用 [self.view endEditing:NO] 直接取消当前Window上的各种view的键盘 [[[UIApplication sharedApplication] keyWindow] endEditing:YES]; 或者使用如下代码 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(done:)]; tapGestureRecognizer.numberOfTapsRequired = 1; [self.view addGestureRecognizer: tapGestureRecognizer]; //只需要点击非文字输入区域就会响应hideKeyBoard return YES; }
5:UIView中的坐标转换
// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 将像素point从view中转换到当前视图中,返回在当前视图中的像素值 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view; // 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view; // 将rect从view中转换到当前视图中,返回在当前视图中的rect - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view; 例把UITableViewCell中的subview(btn)的frame转换到 controllerA中 // controllerA 中有一个UITableView, UITableView里有多行UITableVieCell,cell上放有一个button // 在controllerA中实现: CGRect rc = [cell convertRect:cell.btn.frame toView:self.view]; 或 CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell]; // 此rc为btn在controllerA中的rect 或当已知btn时: CGRect rc = [btn.superview convertRect:btn.frame toView:self.view]; 或 CGRect rc = [self.view convertRect:btn.frame fromView:btn.superview]; 比如: CGPoint origin = [self convertPoint:CGPointZero toView:[UIApplication sharedApplication].keyWindow]; 把self的0点坐标系,放到keyWindow的坐标系换算一下,获得一个“绝对的”坐标 一个在父控件中的坐标为0,0 其实父控件本来有坐标200,200 通过上面可以获得这个200,200值
6:弹出一个视图,并有一个背影的视图(大体代码)
- (UIView *)myTapBackgroundView{ if (!_myTapBackgroundView) { _myTapBackgroundView = ({ UIView *view = [[UIView alloc] initWithFrame:kScreen_Bounds]; view.backgroundColor = [UIColor clearColor]; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeShowing)]; [view addGestureRecognizer:tap]; view; }); } return _myTapBackgroundView; } - (UIView *)myContentView{ if (!_myContentView) { _myContentView = ({ UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; view.backgroundColor = [UIColor whiteColor]; view; }); } return _myContentView; } - (void)changeShowing{ [kKeyWindow endEditing:YES]; if (!_myContentView) {//未载入过 [self loadUIElement]; } CGPoint origin = [self convertPoint:CGPointZero toView:kKeyWindow]; CGFloat contentHeight = self.isShowing? 0: kCodeBranchTagButton_ContentHeight; if (self.isShowing) {//隐藏 self.enabled = NO; [UIView animateWithDuration:0.3 animations:^{ self.myTapBackgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0]; self.myContentView.alpha = 0; self.myContentView.frame = CGRectMake(0, origin.y-contentHeight, kScreen_Width, contentHeight); self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, DEGREES_TO_RADIANS(180)); } completion:^(BOOL finished) { [self.myTapBackgroundView removeFromSuperview]; [self.myContentView removeFromSuperview]; self.enabled = YES; self.isShowing = NO; }]; }else{//显示 self.myContentView.frame = CGRectMake(0, origin.y, kScreen_Width, 0); [kKeyWindow addSubview:self.myTapBackgroundView]; [kKeyWindow addSubview:self.myContentView]; self.enabled = NO; [UIView animateWithDuration:0.3 animations:^{ self.myTapBackgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2]; self.myContentView.alpha = 1.0; self.myContentView.frame = CGRectMake(0, origin.y-contentHeight, kScreen_Width, contentHeight); self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, DEGREES_TO_RADIANS(180)); } completion:^(BOOL finished) { self.enabled = YES; self.isShowing = YES; }]; } } 其中:#define kScreen_Bounds [UIScreen mainScreen].bounds #define kKeyWindow [UIApplication sharedApplication].keyWindow
运用在项目中一个下拉菜单:
/**
* @author wujunyang, 15-05-13 14:05:12
*
* @brief 初始化背景视图
* @return <#return value description#>
*/
- (UIView *)myTapBackgroundView{
if (!_myTapBackgroundView) {
_myTapBackgroundView = ({
UIView *view = [[UIView alloc] initWithFrame:SCREENFRAME];
view.backgroundColor = [UIColor clearColor];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeShowing)];
[view addGestureRecognizer:tap];
view;
});
}
return _myTapBackgroundView;
}
/**
* @author wujunyang, 15-05-13 14:05:25
*
* @brief 初始化弹出视图
* @return <#return value description#>
*/
- (UIView *)myContentView{
if (!_myContentView) {
_myContentView = ({
UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
view.backgroundColor = [UIColor whiteColor];
view;
});
}
return _myContentView;
}
/**
* @author wujunyang, 15-05-13 14:05:39
*
* @brief 加载xib文件到弹出视图里面
*/
- (void)loadUIElement{
self.myTapBackgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
self.homeMyselfMenuView=[HomeMyselfMenuView instanceHomeMyselfMenuView];
self.homeMyselfMenuView.frame = CGRectMake(0, 0, 0, 0);//注意其宽高
[self.myContentView addSubview:self.homeMyselfMenuView];
}
/**
* @author wujunyang, 15-05-13 14:05:07
*
* @brief 控制视图的显示及隐藏
*/
- (void)changeShowing{
if (!_myContentView) {
[self loadUIElement];
}
CGFloat contentHeight = self.isShowing? 0: STATUSNAVBARHEIGHT;
if (self.isShowing) {//隐藏
[self narrowTransToView:NO];
[UIView animateWithDuration:0.3 animations:^{
self.myTapBackgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
self.myContentView.alpha = 0;
self.myContentView.frame = CGRectMake(0,0, SCREEN_WIDTH, contentHeight);
} completion:^(BOOL finished) {
[self.myTapBackgroundView removeFromSuperview];
[self.myContentView removeFromSuperview];
self.isShowing = NO;
}];
}else{//显示
[self narrowTransToView:YES];
self.myContentView.frame = CGRectMake(0, STATUSNAVBARHEIGHT, SCREEN_WIDTH, 0);
[self.view addSubview:self.myTapBackgroundView];
[self.view addSubview:self.myContentView];
[UIView animateWithDuration:0.3 animations:^{
self.myTapBackgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6];
self.myContentView.alpha = 1.0;
self.myContentView.frame = CGRectMake(0, STATUSNAVBARHEIGHT, SCREEN_WIDTH, contentHeight);
} completion:^(BOOL finished) {
self.isShowing = YES;
}];
}
}
/**
* @author wujunyang, 15-05-13 15:05:22
*
* @brief 视图区缩放
* @param isNarrow 是否缩放
*/
-(void)narrowTransToView:(BOOL)isNarrow
{
_contentView.transform=CGAffineTransformIdentity;
[UIView beginAnimations:nil context:UIGraphicsGetCurrentContext()];
if(isNarrow)
{
_contentView.transform=CGAffineTransformMakeScale(0.9f, 0.9f);
}
else
{
_contentView.transform=CGAffineTransformMakeScale(1.0f, 1.0f);
}
[UIView commitAnimations];
}