- 浏览: 173903 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
wkf9924:
yle.webkitTextSizeAdjust= '200% ...
UIWebView字体放大 -
gty3d987321:
尼玛呀 全是X组成的图图X X X X X X X X ...
用JAVA生成二维码 -
yt729134766:
代码不完整
用JAVA生成二维码 -
hy_zhym:
这样生成的二维码,最多能存多少字符????
用JAVA生成二维码 -
mrjeye:
呵呵,我成功过。
用JAVA生成二维码
有的时候,我们需要使用非规则形状的按钮。UIButton允许你选择带有alpha通道的图像。比如,我使用下面四个图像:
然后用Interface Builder创建用户定义按钮,你可以透过图像的透明部分看到后面的按钮(假定按钮未定义为opaque)。.然而 UIButton 的点击测试(hit-testing)并未考虑图像的透明性,所以当你将图像重叠放置时,如图所示:
如果你点击此处:
默认的点击测试的结果是绿色菱形按钮被按下,而不是蓝色按钮。当然这可能就是你需要的效果,但大部分情况下并非如你所愿。那么怎样才能让你的程序正常工作?实际上很简单,你只需要一个UIButton的子类并重写点击测试方法。
然而,首先你需要一个方法能确定图像上指定点是透明的。遗憾的是UIImage无法像Cocoa为NSImage提供的 NSBitmapRepresentation 那样方便地访问位图数据。但是每个UIImage都具有一个称为CGImage的属性可以访问内部图像数据,Apple发布了一篇技术文章介绍了怎样通过CGImageRef访问内部位图数据 。
根据这篇文章的介绍,我们很容易就写出一个方法,它以CGPoint为参数,根据该点是否透明(0)与否返回YES或NO。
UIImage-Alpha.h
1
2 3 4 5 6 7 8 |
#import <UIKit/UIKit.h>
@interface UIImage( Alpha) - ( NSData * ) ARGBData; - ( BOOL ) isPointTransparent: ( CGPoint) point; @end |
UIImage-Alpha.m
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
CGContextRef CreateARGBBitmapContext (
CGImageRef inImage)
{ CGContextRef context = NULL ; CGColorSpaceRef colorSpace; void * bitmapData; int bitmapByteCount; int bitmapBytesPerRow; size_t pixelsWide = CGImageGetWidth( inImage) ; size_t pixelsHigh = CGImageGetHeight( inImage) ; bitmapBytesPerRow = ( pixelsWide * 4) ; bitmapByteCount = ( bitmapBytesPerRow * pixelsHigh) ; colorSpace = CGColorSpaceCreateDeviceRGB( ) ; if ( colorSpace == NULL ) return nil ; bitmapData = malloc ( bitmapByteCount ) ; if ( bitmapData == NULL ) { CGColorSpaceRelease( colorSpace ) ; return nil ; } context = CGBitmapContextCreate ( bitmapData, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst) ; if ( context == NULL ) { free ( bitmapData) ; fprintf ( stderr , "Context not created!" ) ; } CGColorSpaceRelease( colorSpace ) ; return context; } @implementation UIImage( Alpha) - ( NSData * ) ARGBData { CGContextRef cgctx = CreateARGBBitmapContext( self.CGImage) ; if ( cgctx == NULL ) return nil ; size_t w = CGImageGetWidth( self.CGImage) ; size_t h = CGImageGetHeight( self.CGImage) ; CGRect rect = { { 0,0} ,{ w,h} } ; CGContextDrawImage( cgctx, rect, self.CGImage) ; void * data = CGBitmapContextGetData ( cgctx) ; CGContextRelease( cgctx) ; if ( ! data) return nil ; size_t dataSize = 4 * w * h; // ARGB = 4 8-bit components return [ NSData dataWithBytes: data length: dataSize] ; } - ( BOOL ) isPointTransparent: ( CGPoint) point { NSData * rawData = [ self ARGBData] ; // See about caching this if ( rawData == nil ) return NO ; size_t bpp = 4 ; size_t bpr = self.size.width * 4 ; NSUInteger index = point.x * bpp + ( point.y * bpr) ; char * rawDataBytes = ( char * ) [ rawData bytes] ; return rawDataBytes[ index] == 0 ; } @end |
一旦我们有能力确定图像中的某点是否透明,我们就可以编写UIButton的子类,重写hitTest:withEvent: 方法。它将返回一个UIView的实例。如果该点在此视图或其子视图中未被点击,那么将返回nil。如果点击在其子视图,那么将返回点击中的子视图,如果 点击中视图,那么返回视图本身。
然而,我们可以进行一些简化,这是因为尽管UIButton继承了UIView,技术上可能具有子视图,但这非常的少见,而且Interface Builder并不支持这样做。所以在本文的实现中并不考虑子视图。
IrregularShapedButton.h
1
2 3 4 5 6 7 |
#import <UIKit/UIKit.h>
@interface IrregularShapedButton : UIButton { } @end |
IrregularShapedButton.m
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#import "IrregularShapedButton.h"
#import "UIImage-Alpha.h" @implementation IrregularShapedButton - ( UIView * ) hitTest: ( CGPoint) point withEvent: ( UIEvent * ) event { if ( ! CGRectContainsPoint( [ self bounds] , point) ) return nil ; else { UIImage * displayedImage = [ self imageForState: [ self state] ] ; if ( displayedImage == nil ) // No image found, try for background image displayedImage = [ self backgroundImageForState: [ self state] ] ; if ( displayedImage == nil ) // No image could be found, fall back to return self; BOOL isTransparent = [ displayedImage isPointTransparent: point] ; if ( isTransparent) return nil ; } return self; } @end |
将Interface Builder中的四个图像按钮改为IrregularShapedButton,它们将正常工作了。
原文见:Irregularly Shaped UIButton
发表评论
-
itunesconnect不能打开同意协议更新
2012-06-20 14:59 974https://developer.apple.com/mem ... -
根据错误编号取得错误描述
2012-05-17 14:54 908NSError *error = [NSError err ... -
取设备信息
2012-03-30 14:11 818NSLog([[UIDevice currentDevic ... -
为CoreData添加版本管理
2012-03-30 10:32 1687/** Returns the persistent ... -
Xcode4.3 控制台中文乱码
2012-03-22 17:06 773shift+command+< 修改 Run proj ... -
强引用与弱引用探讨
2012-03-16 10:51 998保留一个对象创建了一 ... -
苛刻的单例
2012-02-24 17:26 901作为设计模式中最简单的一个,单例模式还是在很多系统中都会用到, ... -
添加Three20到项目中
2012-02-22 14:33 904省去一切关于Three20的介绍 下载地址:https:// ... -
接近感应传感器使用
2012-02-16 14:22 2205[[UIDevice currentDevice] set ... -
应用程序内跳转到评论地址
2012-02-16 14:15 983int appleID = 0; // 应用程序编号 ... -
传感器使用
2012-02-16 11:57 926在实际的应用开发中,会用到传感器,下面首先介绍一下iphone ... -
拍照图片方向修正
2012-02-15 10:41 1525+ (UIImage *)rotateImage:(UII ... -
uiview动画
2012-02-14 17:38 945CATransition *transition = [C ... -
设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误
2012-02-02 14:53 5468我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCE ... -
震动(系统声音)
2012-02-02 14:19 758AudioServicesPlaySystemSound( ... -
NSPredicate及正则表达式的使用心得 分享
2012-01-17 17:24 3490判断字符串首字母是否为字母。 Objective-c代码 NS ... -
UISearchDisplayController使用
2012-01-14 10:53 7451用UISearchBar初始化,设置代理 UISearch ... -
ios录音
2011-12-31 16:40 2952- (AVAudioRecorder*)audioReco ... -
详解Objective-c Block应用
2011-12-20 13:52 810目前只有Mac 10.6 和iOS 4有支援。Block是 ... -
uilabel字体适应宽度
2011-12-08 18:19 2052textFieldCount.adjustsFontSiz ...
相关推荐
IOS 不规则按钮实现方法 直接引用即可
UIButton+Badge,通过运行时的方式对UIButton拓展了标签展示功能 .
UIButton 的图文混排,就一个API 还可以在xib里面实现
uibutton的一些基本使用,简单的属性,再加一些封装
iphone中的基础控件UIButton扩展,自定义UICheckBox, 适合初学者,主要学习自定义UICheckBox的常用属性设置、点击事件、返回所有选中的box索引等
ios 自定义uibutton
UIButton,UILabel文字旋转(倾斜),UIButton,UILabel文字旋转(倾斜)
使用一句代码为UIbutton增加不同状态的配置(borderColor, titleLabelFont, backgroundColor,subView) 最新代码请移步github: https://github.com/spWang/UIButton-State 如果在使用过程中发现问题,请联系我,...
UIbutton培训学习代码
通过该类可以任意为UIView/UIButton等控件添加某条边的边框,包括边框大小和颜色
FSCustomButtonDemo 一个高度自定义UIButton控件,自定义按钮布局样式
UIButton中,默认title在右,image在左。然而很多情况下需要不同的布局,比如左右调换,上下布局。这边利用UIEdgeTitle和UIEdgeImage很好的解决了这种场景
CCAnimationBtn 一个UIButton子类,模仿抖音App中点赞按钮的动画效果
UIButton使用方法汇总
一个按钮,添加手势,左右滑,给按钮不同的事件。
DFCountDownButton,继承UIButton,实现IOS倒计时按钮,用于注册等发送验证码的时候进行倒计时操作
发送验证码 解决UIbutton闪烁 (一个按钮搞定) 更多欢迎关注: http://blog.csdn.net/u014220518?viewmode=list
一个小而灵活的UIButton子类,动画加载进度,完成动画
1、可任意调整图片对齐方式 2、显示位置 3、可以设置图片的大小 4、设置泡泡 5、点击状态变更 如有意见请留言,谢谢。
总结了Swift语言下的UIButton的常用方式,以及RxSwift+MVVM模式下UIButton的使用。