• 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
  • 相关阅读:
    vc 获得文件相对路径
    C#关闭MessageBox消息框(转)
    ip地址及地理位置查询
    WinDbg关联dump文件
    国外程序员推荐:每个程序员都应读的书
    [转]史上最全的C位域总结201036 2:58:00
    android 屏幕保持唤醒 不锁屏
    [转]win7如何共享
    一些DirectUI方面的资料
    计算器程序,可以计算正实数范围内的任何数据的加减乘除括号,混合运算
  • 原文地址:https://www.cnblogs.com/ihojin/p/custom-shape-view.html
Copyright © 2020-2023  润新知