原文地址: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!
分享到:
相关推荐
首先,我们来理解不规则视图的核心概念。在UIKit框架中,`UIView`是所有视图的基础类,它默认是一个矩形。但通过重写`UIView`的`drawRect:`方法,我们可以自定义绘制任意形状。在`drawRect:`方法内部,我们使用`...
在iOS开发中,我们可以使用Swift或Objective-C,利用`UIView`的子类和`CALayer`来创建不规则形状。在`draw(_ rect:)`方法中,使用`CGContext`进行绘图,同样调用`addEllipse(in:)`或`addPath()`方法。对于交互,可以...
在iOS开发中,有时我们需要创建不规则图形,例如自定义的按钮、形状或者动画效果,这时我们可以利用Core Graphics框架中的Bezier路径(Bezier Path)来实现。贝塞尔曲线是一种平滑曲线,广泛应用于图形设计和计算机...
通过使用Xib和自定义UIView类,我们可以创建一个高度定制的TabbarController,不仅可以自由调整其外观,还能方便地替换图片,以满足不规则的设计需求。这种方法对于那些希望在iOS应用中实现独特用户体验的开发者来说...
5. **按钮行为**:如果这个不规则图形需要像按钮一样响应点击,可以添加一个`UIButton`作为`IRregularShapeView`的子视图,并调整其frame以覆盖整个不规则图形。这样,点击事件就会被按钮捕获并触发相应的动作。 ...
在iOS中,我们可以使用`UIBezierPath`(Foundation框架的Objective-C版本)或`CGPath`(Core Graphics框架的Swift版本)来创建不规则图形。 创建不规则图形的基本步骤如下: 1. **初始化BezierPath对象**:首先,...
创建一个矩形边界来包含不规则图形,然后检查触摸点是否在该边界内。 2. UIView子类化: 另一种方法是创建一个自定义的UIView子类,重写`hitTest(_:with:)`方法。在这个方法中,你可以利用`BezierPath`进行碰撞...
在iOS开发中,创建不规则形状的按钮是一个挑战,因为标准的UIButton类只提供矩形或椭圆形的形状。然而,通过使用自定义视图和绘图技术,开发者可以实现各种复杂的按钮形状。这里我们将深入探讨如何实现不规则按钮,...
- 为不规则按钮添加动画效果,如按下时的缩放或颜色变化,可以使用UIView的`animate(withDuration:animations:)`方法。 - 修改CAShapeLayer的属性(如`fillColor`或`transform`)以实现动画效果。 在提供的压缩包...
7. **遮罩和背景**:`UIView`的`backgroundColor`属性可以设置背景颜色,`maskLayer`属性则可以添加遮罩层,实现不规则形状的视图。 8. **视图控制器**:`UIViewController`通常与`UIView`配合使用,负责管理视图的...
通过重写这个方法,我们可以自定义触摸事件的检测逻辑,使其适应不规则形状的视图。对于圆形,可以通过计算距离来判断;对于更复杂的形状,可以利用`UIBezierPath`的`contains(_:)`方法。理解并熟练运用这些技术,将...
创建不规则按钮的核心在于自定义视图(UIView)及其子类,如UIButton。通过重写`hitTest:withEvent:`方法,我们可以指定按钮的可点击区域,使其与按钮的图形形状相匹配,即使这个形状是不规则的。`hitTest:withEvent...
- **shadowPath**:如果视图的边界是规则的,设置`shadowPath`可以提高渲染性能。例如: ```swift view.layer.shadowPath = UIBezierPath(rect: view.bounds).cgPath ``` - **shouldRasterize** 和 **...
在iOS开发中,有时我们需要创建不规则图形,例如自定义的按钮、形状或者地图上的标记等。这些不规则图形的绘制通常通过Core Graphics框架来实现,特别是使用`UIBezierPath`类。`UIBezierPath`提供了强大的功能,可以...
在Swift中,我们可以通过扩展`UIView`并实现必要的方法和属性来创建自定义视图。在这个案例中,子类可能会包含用于显示和处理图片的属性,如`UIImage`实例,以及用于用户交互的触摸事件处理方法,如`touchesBegan`, ...
1. **定义布局规则**:DLLLayout支持创建自定义的布局规则,如设置视图的宽度等于另一视图的宽度,或者让视图与父视图的边缘保持一定的距离。 2. **链式语法**:框架提供了链式调用接口,使得代码更加简洁易读。你...
总之,“ios-不规则卡片式按钮弹出效果与多控制器联动”项目是一个很好的学习资源,它展示了如何在iOS应用中创建独特交互和动画效果,以及如何在多个控制器之间进行流畅的导航。通过研究项目的源代码,开发者可以...
随机分布则是指视图的位置和大小不遵循特定规律,而是由程序生成的随机值决定,从而营造出一种自然、不规则的效果。 1. **随机位置与大小**:在iOS中,我们可以利用Swift的`arc4random_uniform()`函数来生成0到某个...
- **应用布局**:将布局应用到 `UIView` 或 `NSView` 的子视图数组上,LayoutKit 会自动更新视图的位置和大小。 - **自定义布局**:继承 `LKLayout` 类并重写相关方法,实现自定义的布局逻辑。 3. **实例应用**...
通过这种方式,你可以灵活地控制`UIView`的圆角效果,不仅限于四个角的圆润程度,还可以实现更多复杂的设计,如梯形、倒梯形等不规则形状的圆角。在实际项目中,这种技术广泛应用于按钮、卡片视图、提示框等各种界面...