在CALayer上实现四边形(可以单独控制每个角点),CGGeometry函数、UIView/CALayer属性以及其他非常有价值工具。
安装
pod 'AGGeometryKit'
Swift中导入
import AGGeometryKit
Objective-C中导入
#import <AGGeometryKit/AGGeometryKit.h>
演示
结合POP使用,这可以让您完成一些真正令人印象深刻的任务。访问AGGeometryKit+POP。
四边形
四边形是一个有四条边(或边线)和四个顶点或角落的多边形。AGGeometryKit 允许您单独控制每个角落点。
您可以将 quadrilateral 作为属性,就像使用 frame、center 或 bounds 一样访问。坐标与 frame 和 position 所在的坐标系相同。您可以在任何 UIView 或 CALayer 上使用四边形,甚至 webview,其性能与不使用它时一样好。底层技术是 CATransform3D。更多关于四边形的信息:http://en.wikipedia.org/wiki/Quadrilateral
UIView *view = ...; // create a view
[view.layer ensureAnchorPointIsSetToZero]; // set the anchor point to [0, 0] (this method keeps the same position)
AGKQuad quad = view.layer.quadrilateral;
quad.br.x += 20; // shift bottom right x-value with 20 pixels
quad.br.y += 50; // shift bottom right y-value with 50 pixels
view.layer.quadrilateral = quad; // the quad is converted to CATransform3D and applied
UIView 和 CALayer 属性
以下是一些添加到 UIView 和 CALayer 中的属性示例。命名方式与 CGRectGetMaxX
相同,以确保一致性。
...
@property (nonatomic, assign) CGPoint frameOrigin;
@property (nonatomic, assign) CGFloat frameMinX;
@property (nonatomic, assign) CGFloat frameMinY;
@property (nonatomic, assign) CGFloat frameMidX;
@property (nonatomic, assign) CGFloat frameMidY;
@property (nonatomic, assign) CGFloat frameMaxX;
@property (nonatomic, assign) CGFloat frameMaxY;
@property (nonatomic, assign) CGFloat frameWidth;
@property (nonatomic, assign) CGFloat frameHeight;
...
CGGeometry-扩展
一些最有用的函数
...
CGRect CGRectInterpolate_AGK(CGRect rect1, CGRect rect2, CGFloat progress);
CGSize CGRectGapBetween_AGK(CGRect rect1, CGRect rect2);
CGPoint CGPointClamp_AGK(CGPoint p, CGFloat minX, CGFloat maxX, CGFloat minY, CGFloat maxY);
CGPoint CGPointAdd_AGK(CGPoint p1, CGPoint p2);
...
数学
一些最有用的函数
...
CGFloat AGKInterpolate(CGFloat startValue, CGFloat endValue, CGFloat progress);
CGFloat AGKRemapToZeroOne(CGFloat value, CGFloat startValue, CGFloat endValue);
CGFloat AGKRemap(CGFloat value, CGFloat oldStartValue, CGFloat oldEndValue, CGFloat newStartValue, CGFloat newEndValue);
CGFloat AGKRemapAndClamp(CGFloat value, CGFloat oldStartValue, CGFloat oldEndValue, CGFloat newStartValue, CGFloat newEndValue);
CGFloat AGKRemapToZeroOneAndClamp(CGFloat value, CGFloat oldStartValue, CGFloat oldEndValue);
CGFloat AGKClamp(CGFloat value, CGFloat min, CGFloat max);
CGFloat AGKRadiansToDegrees(CGFloat radians);
CGFloat AGKDegreesToRadians(CGFloat degrees);
...
调试四边形
- 使用四边形时,anchorPoint 必须始终为 {0, 0}
- 四边形必须是凸四边形
- 不要修改框架,而应使用
layer.position
或view.center
以及layer.bounds
或view.bounds
- 四边形不能与其他 CATransform3D 物件(如透视、缩放、旋转等)一起使用
- 请记住,quadrilateral 属性的坐标系与
frame
和position
的相同 - 检查自动调整大小遮罩是否会修改框架(要确保用于调试,请关闭
autoresizesSubviews
)
使用UIBezierPath创建您试图显示的四边形的表示也有帮助。
UIView *quadPreview = [[UIView alloc] init];
quadPreview.frame = quadView.frame;
quadPreview.layer.shadowPath = [UIBezierPath bezierPathWithAGQuad:quad].CGPath;
quadPreview.layer.shadowColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:0.5].CGColor;
quadPreview.layer.shadowOpacity = 1.0;
quadPreview.layer.shadowRadius = 0.0;
quadPreview.layer.shadowOffset = CGSizeZero;
quadPreview.backgroundColor = [UIColor clearColor];
[quadView.superview addSubview:quadPreview];
有用链接
- Bartosz Ciechanowski于2012年12月左右使用四边形创建了一个魔法效果。
- Stack Overflow上的四边形
- 想要与我们合作?请访问agens.no
关键词
凸四边形,简单四边形,切线,风筝,菱形,正方形,梯形,梯形,平行四边形,内心四边形,圆内四边形
联系方式
您可以通过twitter上的@hfossli联系到我。
此项目由谁创建?
Agens.no是一家位于挪威奥斯陆的公司,得到了一些非常聪明的Stack Overflow.com网友的帮助。