`
miss大为
  • 浏览: 82559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

UIView创建不规则视图

阅读更多
原文地址: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!
分享到:
评论

相关推荐

    ios 不规则view定制demo

    首先,我们来理解不规则视图的核心概念。在UIKit框架中,`UIView`是所有视图的基础类,它默认是一个矩形。但通过重写`UIView`的`drawRect:`方法,我们可以自定义绘制任意形状。在`drawRect:`方法内部,我们使用`...

    不规则形状控件的制作

    在iOS开发中,我们可以使用Swift或Objective-C,利用`UIView`的子类和`CALayer`来创建不规则形状。在`draw(_ rect:)`方法中,使用`CGContext`进行绘图,同样调用`addEllipse(in:)`或`addPath()`方法。对于交互,可以...

    iOS绘制不规则图形,并且添加点击事件

    在iOS开发中,有时我们需要创建不规则图形,例如自定义的按钮、形状或者动画效果,这时我们可以利用Core Graphics框架中的Bezier路径(Bezier Path)来实现。贝塞尔曲线是一种平滑曲线,广泛应用于图形设计和计算机...

    iOS 自定义简单不规则TabbarController

    通过使用Xib和自定义UIView类,我们可以创建一个高度定制的TabbarController,不仅可以自由调整其外观,还能方便地替换图片,以满足不规则的设计需求。这种方法对于那些希望在iOS应用中实现独特用户体验的开发者来说...

    iOS开发 不规则图形点击

    5. **按钮行为**:如果这个不规则图形需要像按钮一样响应点击,可以添加一个`UIButton`作为`IRregularShapeView`的子视图,并调整其frame以覆盖整个不规则图形。这样,点击事件就会被按钮捕获并触发相应的动作。 ...

    iOS 绘制不规则图形,并且添加点击事件

    在iOS中,我们可以使用`UIBezierPath`(Foundation框架的Objective-C版本)或`CGPath`(Core Graphics框架的Swift版本)来创建不规则图形。 创建不规则图形的基本步骤如下: 1. **初始化BezierPath对象**:首先,...

    iOS 绘制不规则图形,并且添加点击事件 的两种方法

    创建一个矩形边界来包含不规则图形,然后检查触摸点是否在该边界内。 2. UIView子类化: 另一种方法是创建一个自定义的UIView子类,重写`hitTest(_:with:)`方法。在这个方法中,你可以利用`BezierPath`进行碰撞...

    ios-不规则按钮的实现.zip

    在iOS开发中,创建不规则形状的按钮是一个挑战,因为标准的UIButton类只提供矩形或椭圆形的形状。然而,通过使用自定义视图和绘图技术,开发者可以实现各种复杂的按钮形状。这里我们将深入探讨如何实现不规则按钮,...

    ios不规则按钮

    - 为不规则按钮添加动画效果,如按下时的缩放或颜色变化,可以使用UIView的`animate(withDuration:animations:)`方法。 - 修改CAShapeLayer的属性(如`fillColor`或`transform`)以实现动画效果。 在提供的压缩包...

    uiview源码使用

    7. **遮罩和背景**:`UIView`的`backgroundColor`属性可以设置背景颜色,`maskLayer`属性则可以添加遮罩层,实现不规则形状的视图。 8. **视图控制器**:`UIViewController`通常与`UIView`配合使用,负责管理视图的...

    ios的hitTest方法以及不规则区域内触摸事件处理方法

    通过重写这个方法,我们可以自定义触摸事件的检测逻辑,使其适应不规则形状的视图。对于圆形,可以通过计算距离来判断;对于更复杂的形状,可以利用`UIBezierPath`的`contains(_:)`方法。理解并熟练运用这些技术,将...

    不规则按钮

    创建不规则按钮的核心在于自定义视图(UIView)及其子类,如UIButton。通过重写`hitTest:withEvent:`方法,我们可以指定按钮的可点击区域,使其与按钮的图形形状相匹配,即使这个形状是不规则的。`hitTest:withEvent...

    自定义 UIView的阴影效果

    - **shadowPath**:如果视图的边界是规则的,设置`shadowPath`可以提高渲染性能。例如: ```swift view.layer.shadowPath = UIBezierPath(rect: view.bounds).cgPath ``` - **shouldRasterize** 和 **...

    iOS 绘制不规则图形,不错的添加点击事件的两种方法

    在iOS开发中,有时我们需要创建不规则图形,例如自定义的按钮、形状或者地图上的标记等。这些不规则图形的绘制通常通过Core Graphics框架来实现,特别是使用`UIBezierPath`类。`UIBezierPath`提供了强大的功能,可以...

    swift-一个UIView子类实现图片手动切割组件自动切割选取部分的图片

    在Swift中,我们可以通过扩展`UIView`并实现必要的方法和属性来创建自定义视图。在这个案例中,子类可能会包含用于显示和处理图片的属性,如`UIImage`实例,以及用于用户交互的触摸事件处理方法,如`touchesBegan`, ...

    swift-DLLLayout是一个基于UIView.frame的轻量级iOS布局框架

    1. **定义布局规则**:DLLLayout支持创建自定义的布局规则,如设置视图的宽度等于另一视图的宽度,或者让视图与父视图的边缘保持一定的距离。 2. **链式语法**:框架提供了链式调用接口,使得代码更加简洁易读。你...

    ios-不规则卡片式按钮弹出效果与多控制器联动.zip

    总之,“ios-不规则卡片式按钮弹出效果与多控制器联动”项目是一个很好的学习资源,它展示了如何在iOS应用中创建独特交互和动画效果,以及如何在多个控制器之间进行流畅的导航。通过研究项目的源代码,开发者可以...

    ios-随机分布View.zip

    随机分布则是指视图的位置和大小不遵循特定规律,而是由程序生成的随机值决定,从而营造出一种自然、不规则的效果。 1. **随机位置与大小**:在iOS中,我们可以利用Swift的`arc4random_uniform()`函数来生成0到某个...

    来自 linkedin 的快速视图布局库.zip

    - **应用布局**:将布局应用到 `UIView` 或 `NSView` 的子视图数组上,LayoutKit 会自动更新视图的位置和大小。 - **自定义布局**:继承 `LKLayout` 类并重写相关方法,实现自定义的布局逻辑。 3. **实例应用**...

    UIView-BezierCurve:圆角化UIView的各个角

    通过这种方式,你可以灵活地控制`UIView`的圆角效果,不仅限于四个角的圆润程度,还可以实现更多复杂的设计,如梯形、倒梯形等不规则形状的圆角。在实际项目中,这种技术广泛应用于按钮、卡片视图、提示框等各种界面...

Global site tag (gtag.js) - Google Analytics