AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配
AJ分享,必须精品
效果:
注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮
系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一下操作。
代码:
话不多说,先把所有代码放上来。能看懂就不用看别的了。(这么详细的注释,看不懂才怪。。)
弹出view:NYBuyController.m
//
// NYBuyController.m
// 彩票lottery
//
// Created by apple on 15-5-10.
// Copyright (c) 2015年 znycat. All rights reserved.
//
#import "NYBuyController.h"
#import "NYTitleButton.h"
@interface NYBuyController ()
- (IBAction)titleBtnOnClick:(NYTitleButton *)titleBtn;
// 定义变量记录当前按钮的状态
@property (nonatomic, assign, getter = isOpen) BOOL open;
@property (nonatomic, weak) UIView *contentView;
@end
@implementation NYBuyController
/**懒加载,点击标题弹出的view*/
-(UIView *)contentView
{
if (_contentView == nil) {
// 添加将来需要显示的View
UIView *contentView = [[UIView alloc] init];
contentView.backgroundColor = [UIColor greenColor];
contentView.frame = CGRectMake(0, 64, 320, 200);
[self.view addSubview:contentView];
_contentView = contentView;
// 隐藏该View
}
return _contentView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.contentView.hidden = YES;
}
- (IBAction)titleBtnOnClick:(NYTitleButton *)titleBtn {
if (!self.isOpen) {// 没有打开
[UIView animateWithDuration:1.0 animations:^{
// 1.旋转按钮上的尖尖
titleBtn.imageView.transform = CGAffineTransformMakeRotation(M_PI);
}];
// 改变当前按钮的状态
CATransition *ca = [CATransition animation];
ca.type = @"cube";
[self.contentView.layer addAnimation:ca forKey:nil];
self.open = YES;
// 显示内容view
self.contentView.hidden = NO;
}else // 已经打开
{
[UIView animateWithDuration:1.0 animations:^{
// 1.旋转按钮上的尖尖
titleBtn.imageView.transform = CGAffineTransformIdentity;
}];
// 改变当前按钮的状态
//添加动画
CATransition *ca = [CATransition animation];
ca.type = @"cube";
[self.contentView.layer addAnimation:ca forKey:nil];
self.open = NO;
// 隐藏内容View
self.contentView.hidden = YES;
}
}
@end
:自定义图片在右边的Button NYTitleButton.m
//
// NYTitleButton.m
// 彩票lottery
//
// Created by apple on 15-5-10.
// Copyright (c) 2015年 znycat. All rights reserved.
//
#import "NYTitleButton.h"
@interface NYTitleButton ()
@property (nonatomic, strong) UIFont *myFont;
@end
@implementation NYTitleButton
-(id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
[self setup];
}
return self;
}
-(id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
[self setup];
}
return self;
}
-(void)setup
{
// 记录按钮标题的字体
self.myFont = [UIFont systemFontOfSize:16];
// 设置标题的字体
self.titleLabel.font = self.myFont;
// 设置按钮的图片显示的内容默认为剧中(为了不拉伸)
self.imageView.contentMode = UIViewContentModeCenter;
}
// 用于返回按钮上标题的位置, 传入按钮的rect
- (CGRect)titleRectForContentRect:(CGRect)contentRect
{
CGFloat titleX = 0;
CGFloat titleY = 0;
CGFloat titleH = contentRect.size.height;
// 获取当前按钮上的文字
// [self titleForState:UIControlStateNormal];
NSString *title = self.currentTitle;
CGSize maxSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
NSMutableDictionary *md = [NSMutableDictionary dictionary];
md[NSFontAttributeName] = self.myFont;
// 计算文字的范围
CGFloat titleW = 0;
// 判断是否是xcode5 , 如果是就编译一下代码, 如果不是就不编译
#ifdef __IPHONE_7_0
if (iOS7) { // 是IOS7
CGRect titleRect = [title boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:md context:nil];
titleW = titleRect.size.width;
}else
{
// 非IOS7
CGSize titleSize = [title sizeWithFont:self.myFont];
titleW = titleSize.width;
}
#else
// XCODE4
CGSize titleSize = [title sizeWithFont:self.myFont];
titleW = titleSize.width;
#endif
return CGRectMake(titleX, titleY, titleW, titleH);
}
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
CGFloat imageY = 0;
CGFloat imageH = contentRect.size.height;
CGFloat imageW = 16;
// 图片的X = 按钮的宽度 - 图片宽度
CGFloat imageX = contentRect.size.width - imageW;
return CGRectMake(imageX, imageY, imageW, imageH);
}
@end
iOS6,7简单适配 文件: (Prefix.pch)
#define iOS7 ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0)
具体实现
把按钮图片放右边(自定义图片在右边的按钮)
要想实现自定义按钮位置 主要是重写下面两个方法
- (CGRect)titleRectForContentRect:(CGRect)contentRect;
- (CGRect)imageRectForContentRect:(CGRect)contentRect;
这里上面代码中写的很清楚了,不多说了就,需要注意的是,我们在算title的长度的时候出现了一些状况,那就是iOS6里面没有这个方法,以及xcode4.5版本会编译出错的问题,在这里做了iOS6,7的适配以及编译器的适配:
(iOS7)这个是宏,在pch文件里面有定义
#ifdef __IPHONE_7_0 是Availability.h里的 xcode4.5里面没有
#ifdef __IPHONE_7_0
if (iOS7) { // 是IOS7
CGRect titleRect = [title boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:md context:nil];
titleW = titleRect.size.width;
}else
{
// 非IOS7
CGSize titleSize = [title sizeWithFont:self.myFont];
titleW = titleSize.width;
}
#else
// XCODE4
CGSize titleSize = [title sizeWithFont:self.myFont];
titleW = titleSize.width;
#endif
具体如何重写的实现自定义图片在右边的button
看NYTitleButton.m(在上面)
弹出view
这个没啥好说的,就是开始定义一个view,然后设置hidden 看代码
懒加载contentView 并且在开始调用的适合(viewDidLoad)中设置隐藏。
/**懒加载,点击标题弹出的view*/
-(UIView *)contentView
{
if (_contentView == nil) {
// 添加将来需要显示的View
UIView *contentView = [[UIView alloc] init];
contentView.backgroundColor = [UIColor greenColor];
contentView.frame = CGRectMake(0, 64, 320, 200);
[self.view addSubview:contentView];
_contentView = contentView;
// 隐藏该View
}
return _contentView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.contentView.hidden = YES;
}
在点击按钮时候设置隐藏为no或yes,这里加了两个动画而已
- (IBAction)titleBtnOnClick:(NYTitleButton *)titleBtn {
if (!self.isOpen) {// 没有打开
[UIView animateWithDuration:1.0 animations:^{
// 1.旋转按钮上的尖尖
titleBtn.imageView.transform = CGAffineTransformMakeRotation(M_PI);
}];
// 改变当前按钮的状态
CATransition *ca = [CATransition animation];
ca.type = @"cube";
[self.contentView.layer addAnimation:ca forKey:nil];
self.open = YES;
// 显示内容view
self.contentView.hidden = NO;
}else // 已经打开
{
[UIView animateWithDuration:1.0 animations:^{
// 1.旋转按钮上的尖尖
titleBtn.imageView.transform = CGAffineTransformIdentity;
}];
// 改变当前按钮的状态
//添加动画
CATransition *ca = [CATransition animation];
ca.type = @"cube";
[self.contentView.layer addAnimation:ca forKey:nil];
self.open = NO;
// 隐藏内容View
self.contentView.hidden = YES;
}
}
动画
这个搜easy
//添加动画
CATransition *ca = [CATransition animation];
ca.type = @"cube";
[self.contentView.layer addAnimation:ca forKey:nil];
AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配的更多相关文章
- AJ学IOS(11)UI之图片自动轮播
AJ分享,必须精品 先看效果 代码 #import "NYViewController.h" #define kImageCount 5 @interface NYViewCont ...
- AJ学IOS(07)UI之UITextField代理事件_类似QQ登陆窗口的简单实现
AJ分享,必须精品 先看效果图: 学习代码 // // NYViewController.m // 05-UITextField事件_UIKit复习 // // Created by apple on ...
- AJ学IOS(46)之网易彩票幸运大转盘
AJ分享,必须精品 效果 实现过程: 基础UI搭建 这里主要是用了xib搭建,首先我们分析,有中间的开始按钮,背景图片,还有星座按钮,这里能用xib做的事开始按钮和背景图片. 如图: 星座按钮的搭建: ...
- AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController
AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ...
- AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引
AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...
- AJ学IOS 之ipad开发Popover的基本使用
AJ分享,必须精品 一:效果图 二:注意 对于方法[UIPopoverController dealloc] reached while popover is still visible. 当popo ...
- AJ学IOS 之CoreLocation基本使用
猫猫分享,必须精品AJ 一:CoreLocation的基本使用 使用步骤: 首先导入头文件#import <CoreLocation/CoreLocation.h> 1.创建CoreLoc ...
- AJ学IOS(24)UI之注册案例
AJ分享,必须精品 先看效果 制作思路 在做这个的时候,首先用stroyboard画出来界面UI,这个很简单,不多说了,然后下一步就是自定义xib做键盘上面的那一栏了,需要自己做xib还有view,详 ...
- AJ学IOS(22)UI之UIApplicationDelegate和UIWindow
AJ分享,必须精品 UIApplicationDelegate 每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理 NYAppDelegate默认已经 ...
随机推荐
- 从零开始学习R语言(二)——数据结构之“因素(Factor)”
本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/60101041 也同步更新于我的个人博客:https://www.cnblogs.com/nickwu/p/125370 ...
- hdu1213 并查集板子
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1213/ 并查集是一种支持合并与查找的数据结构,在森林中进行操作,加上路径压缩,合并和查找的时间复杂度几乎都是常数 ...
- 灵感来袭,基于Redis的分布式延迟队列
延迟队列 延迟队列,也就是一定时间之后将消息体放入队列,然后消费者才能正常消费.比如1分钟之后发送短信,发送邮件,检测数据状态等. Redisson Delayed Queue 如果你项目中使用了re ...
- 拿 C# 搞函数式编程 - 3
前言 今天和某个人聊天聊到了 C# 的 LINQ,发现我认识的 LINQ 似乎和大多数人认识的 LINQ 不太一样,怎么个不一样法呢?其实 LINQ 也可以用来搞函数式编程. 当然,并不是说写几个 l ...
- shell脚本基础知识以及变量
一.基础知识 1.shell脚本的格式注意事项 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)."#!/bin/bash" ...
- spring-cloud-gateway过滤器实践
概述 这里是 SpringCloud Gateway 实践的第一篇,主要讲过滤器的相关实现.Spring-Cloud-Gateway 是以 WebFlux 为基础的响应式架构设计, 是异步非阻塞式的, ...
- OpenCV-Python 轮廓分层 | 二十五
目标 这次我们学习轮廓的层次,即轮廓中的父子关系. 理论 在前几篇关于轮廓的文章中,我们已经讨论了与OpenCV提供的轮廓相关的几个函数.但是当我们使用cv.findcontour()函数在图像中找到 ...
- redis++:Redis的两种持久化 RDB 和 AOF
Redis持久化备份数据的方式有两种:RDB(Redis DataBase) . AOF(Append Only File). RDB 什么是RDB: 在指定时间间隔内,将内存中的数据集快照写入磁盘 ...
- Java 获取 IP
/** * 获取访问者IP. * 在一般情况下使用 Request.getRemoteAddr() 即可,但是经过 nginx 等反向代理软件后,这个方法会失效. */ private String ...
- Codeforces 1332F - Independent Set(树dp)
题目链接 题意 给出一棵 n 个点的树, 求它的所有非空诱导子图的独立集种类数之和, 对 998244353 取模. n ≤ 3e5. 题解 不妨假设在独立集中的点被染色成 1, 其余不染色; 由于不 ...