原文地址:http://xubenyang.me/309
总所周知,UIView都是方形的,并不能产生一个不规则的形状的view(小弟才疏学浅,目前确实没有发现能够创建真实不规则视图的方法,如果有,不吝赐教,感激涕零!)。为什么我们有创建不规则view的需求?如果只是为了在View上显示不规则图形那大可不必,直接讲不规则图形添加到view上,然后讲view的backgroundColor设置为UIColor clearColor就可以;但是之所以有这样的需求,很大部分就是为了判断不规则的图形去响应触摸事件,判断图形是否被触摸选中了这样的要求,我们最直接的想法就是每个不规则图形都是一个view,那么图形是否选中就可以通过UIResponder的那一系列触摸有关的响应函数得知了,所以这个时候我们就需要不规则的view。但是显示的杯具是,iOS并没有提供这样的不规则view,如果要完成刚才的需求,就只能手动判断触摸的点是否在不规则图形里面了,这有的时候将是一件比较痛苦的事情。那么现在提供一种“创建不规则view”的解决方案:
不知道大家有没有注意到UIView有这样一个函数:- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 这个函数就是用来判断指定的点是否在View内,我们方法就是在这个函数中,如果point在指定的不规则图形内返回YES,反之就返回NO。这样不规则图形的bounds就相当于代表了view自己的bounds。这样当你触摸view的时候,当且只有当触摸到指定图形内才会使得view被触摸到,才会调用到UIResponder一系列触摸响应事件。
代码如下:
RoundView.h
@interface MyView : UIView {
UIBezierPath *_path;
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
@end
RoundView.m
// Print current selector's name
#define PRINT_CURRENT_SEL NSLog(@"<%@> %@", NSStringFromClass([self class]),NSStringFromSelector(_cmd))
//
// PrivateMethods
// This category provide private apis for RoundView class
//
@interface RoundView(PrivateMethods)
// Initialize all view's state
- (void)_init;
// Highlight view's border, better visual effect for testing.
- (void) _highlightBorder;
@end
@implementation RoundView(PrivateMethods)
- (void)_init{
[self _highlightBorder];
self.backgroundColor = [UIColor clearColor];
// Create path object as round rect
_path = [[UIBezierPath bezierPathWithRoundedRect:CGRectInset(self.bounds, 20, 20) cornerRadius:60] retain];
}
- (void) _highlightBorder{
CALayer *theLayer = [self layer];
theLayer.borderColor = [UIColor blueColor].CGColor;
theLayer.borderWidth = 2;
}
@end
#pragma mark -
@implementation RoundView
- (id)initWithCoder:(NSCoder *)aDecoder{
if((self = [super initWithCoder:aDecoder])){
[self _init];
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
[self _init];
}
return self;
}
- (void)drawRect:(CGRect)rect {
[[UIColor redColor] setFill];
[_path fill];
}
- (void)dealloc {
[_path release];
[super dealloc];
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
return [_path containsPoint:point];
}
#pragma mark -
#pragma mark UIResponder touches
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
PRINT_CURRENT_SEL;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
PRINT_CURRENT_SEL;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
PRINT_CURRENT_SEL;
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
PRINT_CURRENT_SEL;
}
@end
这个demo中用到了3.2以后提供的UIBezierPath类,来创建一个图形的path,在pointInside:withEvent:中判断点是不是在图形的里面,如果是返回YES,反之NO。这样就用找个图形的path代表了view的bounds。那么即使你触摸在view内但是没有在找个图形上,touchesBegan就不会被调用,不会打印相应信息在console中。
所以这样这个view的边界就变成了这个不规则图形的边界了,就变相地创建出了一个不规则的view了!cheers!
分享到:
相关推荐
UIVisualEffectView:添加高斯模糊,可以在UIView或者UIImageView等视图
PanSlip - 使用PanGesture来关闭UIViewController和UIView上的视图
NZScrollFullScreen 滚动 UIView 时的全屏视图。 截屏 在行动
CGRectUnionWithSubviews 获取UIView及其所有子视图,所有子视图,所有子视图,所有子视图,所有子视图,所有子视图,所有子视图,所有子视图,所有子视图,所有子视图,所有子视图,所有子视图和所有子视图的...
主要介绍了iOS中UIView的layoutSubviews子视图布局方法使用,文中举了一个layoutSubviews在iPad横竖屏切换时被调用用来重新布局的实例,需要的朋友可以参考下
UIView-UIImageEffects 从 UIView 创建模糊图像
一行代码给任意视图添加高性能圆角,四个角可选 可添加描边属性
UIView 动画 UIView动画
使用NIB父类来创建UIVIEW
实现简单的视图切换 两个VC直接来回切换
ios中关于uiview
从UIView元素创建Xcode预览 SwiftUI功能使用具有的协议来更新UIView属性。 您可以阅读有关更多信息。 例子 直接在SwiftUI中使用UIKit视图: import SwiftUI import SwiftUIKitView struct SwiftUIwithUIKitView :...
使用XIB为UIView创建子类.我真的补知道怎么写20字以上的描述啊
UIView+Extension 对view的一个扩展
xamarin学习笔记B03(ios的UIView的了解)它是所有视图控件的父类。例如UIButton、UILabel、UIImageView等都最终是继承自UIView。它可以添加其它视图作为它的子视图。
UIView AutoLayout ,UIView AutoLayout 是 UIView 的分类,实现了自动布局限制的简单接口。 T...
你的uiview的周围创建动画闪光
PanSlip使用PanGesture可以关闭UIViewController和UIView上的视图。 PanSlip到UIViewController从左到右,从右到左,从上到下,从下到上。PanSlip使用PanGesture可以关闭UIViewController和UIView上的视图。 简介从...
作者yemeksepeti,源码EmoticonParticles,EmoticonParticles 可以在 UIView 创建任意字符串效果。