zoukankan      html  css  js  c++  java
  • iOS: 控制UIView的外形

    #import <UIKit/UIKit.h>
    #import <QuartzCore/QuartzCore.h>
    
    @interface UIView (Shape)
    
    - (void)setShape:(CGPathRef)shape;
    @end
    #import "UIView+Shape.h"
    
    @implementation UIView (Shape)
    
    - (void)setShape:(CGPathRef)shape
    {
        if (shape == nil) {
            self.layer.mask = nil;
        }
        
        CAShapeLayer* maskLayer = [CAShapeLayer layer];
        maskLayer.path = shape;
        self.layer.mask = maskLayer;
    }
    
    @end
    @interface UIBezierPath (BasicShape)
    
    + (UIBezierPath *)cutCorner:(CGRect)originalFrame length:(CGFloat)length;
    @end
    #import "UIBezierPath+BasicShape.h"
    
    @implementation UIBezierPath (BasicShape)
    
    + (UIBezierPath *)cutCorner:(CGRect)originalFrame length:(CGFloat)length
    {
        CGRect rect = originalFrame;
        UIBezierPath *bezierPath = [UIBezierPath bezierPath];
    
        [bezierPath moveToPoint:CGPointMake(0, length)];
        [bezierPath addLineToPoint:CGPointMake(length, 0)];
        [bezierPath addLineToPoint:CGPointMake(rect.size.width - length, 0)];
        [bezierPath addLineToPoint:CGPointMake(rect.size.width, length)];
        [bezierPath addLineToPoint:CGPointMake(rect.size.width, rect.size.height - length)];
        [bezierPath addLineToPoint:CGPointMake(rect.size.width - length, rect.size.height)];
        [bezierPath addLineToPoint:CGPointMake(length, rect.size.height)];
        [bezierPath addLineToPoint:CGPointMake(0, rect.size.height - length)];
        [bezierPath closePath];
        return bezierPath;
    }
    
    @end

    在[UIView viewWillAppear:]方法中加入下面代码

    [self.view setShape:[UIBezierPath cutCorner:self.view.bounds length:40].CGPath];

    效果:

    ################

    让自定义 Button 响应自定义 Shape 内的点击事件

    #import <UIKit/UIKit.h>
    #import "UIView+Shape.h"
    #import "UIBezierPath+BasicShape.h"
    
    @interface RFButton : UIButton{
        CGPathRef path;
    }
    
    @end
    //
    //  RFButton.m
    //  ChristApp
    //
    //  Created by Haozhen Li on 13-12-6.
    //
    //
    
    #import "RFButton.h"
    
    @implementation RFButton
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
        }
        return self;
    }
    
    - (void)setShape:(CGPathRef)shape
    {
        [super setShape:shape];
        path = shape;
    }
    
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        if (CGPathIsEmpty(path)) {
            return YES;
        }
        //判断触发点是否在规定的 Shape 内
        if (CGPathContainsPoint(path, nil, point, nil)) {
            return YES;
        }
        return NO;
    }
    @end
  • 相关阅读:
    一个完善的ActiveX Web控件教程
    用ATL开发和部署ActiveX网页控件
    非IE内核浏览器支持activex插件
    OCX控件在IE中无法侦测到键盘消息( MFC ActiveX Control in IE Doesn't Detect Keystrokes)
    CImageList使用简要说明
    VC,一条会被鼠标移动的直线
    Java NIO学习笔记之基本概念
    netty源码分析
    如何绕过验证码方式总结
    解决Eclipse 启动后总是Building WorkSpace(sleeping)
  • 原文地址:https://www.cnblogs.com/ihojin/p/custom-shape-view.html
Copyright © 2011-2022 走看看