123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- //
- // UIView+YYAdd.m
- // YYKit <https://github.com/ibireme/YYKit>
- //
- // Created by ibireme on 13/4/3.
- // Copyright (c) 2015 ibireme.
- //
- // This source code is licensed under the MIT-style license found in the
- // LICENSE file in the root directory of this source tree.
- //
- #import "UIView+YYAdd.h"
- #import <QuartzCore/QuartzCore.h>
- #import "YYKitMacro.h"
- YYSYNTH_DUMMY_CLASS(UIView_YYAdd)
- @implementation UIView (YYAdd)
- - (UIImage *)snapshotImage {
- // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃
- if (CGSizeEqualToSize(self.bounds.size, CGSizeZero)) {
- return nil;
- }
- UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0);
- [self.layer renderInContext:UIGraphicsGetCurrentContext()];
- UIImage *snap = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return snap;
- }
- - (UIImage *)snapshotImageAfterScreenUpdates:(BOOL)afterUpdates {
- if (![self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
- return [self snapshotImage];
- }
- // 传入的View.frame.size是0的话,直接返回nil,防止 UIGraphicsBeginImageContext() 传入0,导致崩溃
- if (CGSizeEqualToSize(self.bounds.size, CGSizeZero)) {
- return nil;
- }
- UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0);
- [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:afterUpdates];
- UIImage *snap = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return snap;
- }
- - (NSData *)snapshotPDF {
- CGRect bounds = self.bounds;
- NSMutableData *data = [NSMutableData data];
- CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData((__bridge CFMutableDataRef)data);
- CGContextRef context = CGPDFContextCreate(consumer, &bounds, NULL);
- CGDataConsumerRelease(consumer);
- if (!context) return nil;
- CGPDFContextBeginPage(context, NULL);
- CGContextTranslateCTM(context, 0, bounds.size.height);
- CGContextScaleCTM(context, 1.0, -1.0);
- [self.layer renderInContext:context];
- CGPDFContextEndPage(context);
- CGPDFContextClose(context);
- CGContextRelease(context);
- return data;
- }
- - (void)setLayerShadow:(UIColor*)color offset:(CGSize)offset radius:(CGFloat)radius {
- self.layer.shadowColor = color.CGColor;
- self.layer.shadowOffset = offset;
- self.layer.shadowRadius = radius;
- self.layer.shadowOpacity = 1;
- self.layer.shouldRasterize = YES;
- self.layer.rasterizationScale = [UIScreen mainScreen].scale;
- }
- - (void)removeAllSubviews {
- //[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
- while (self.subviews.count) {
- [self.subviews.lastObject removeFromSuperview];
- }
- }
- - (UIViewController *)viewController {
- for (UIView *view = self; view; view = view.superview) {
- UIResponder *nextResponder = [view nextResponder];
- if ([nextResponder isKindOfClass:[UIViewController class]]) {
- return (UIViewController *)nextResponder;
- }
- }
- return nil;
- }
- - (CGFloat)visibleAlpha {
- if ([self isKindOfClass:[UIWindow class]]) {
- if (self.hidden) return 0;
- return self.alpha;
- }
- if (!self.window) return 0;
- CGFloat alpha = 1;
- UIView *v = self;
- while (v) {
- if (v.hidden) {
- alpha = 0;
- break;
- }
- alpha *= v.alpha;
- v = v.superview;
- }
- return alpha;
- }
- - (CGPoint)convertPoint:(CGPoint)point toViewOrWindow:(UIView *)view {
- if (!view) {
- if ([self isKindOfClass:[UIWindow class]]) {
- return [((UIWindow *)self) convertPoint:point toWindow:nil];
- } else {
- return [self convertPoint:point toView:nil];
- }
- }
-
- UIWindow *from = [self isKindOfClass:[UIWindow class]] ? (id)self : self.window;
- UIWindow *to = [view isKindOfClass:[UIWindow class]] ? (id)view : view.window;
- if ((!from || !to) || (from == to)) return [self convertPoint:point toView:view];
- point = [self convertPoint:point toView:from];
- point = [to convertPoint:point fromWindow:from];
- point = [view convertPoint:point fromView:to];
- return point;
- }
- - (CGPoint)convertPoint:(CGPoint)point fromViewOrWindow:(UIView *)view {
- if (!view) {
- if ([self isKindOfClass:[UIWindow class]]) {
- return [((UIWindow *)self) convertPoint:point fromWindow:nil];
- } else {
- return [self convertPoint:point fromView:nil];
- }
- }
-
- UIWindow *from = [view isKindOfClass:[UIWindow class]] ? (id)view : view.window;
- UIWindow *to = [self isKindOfClass:[UIWindow class]] ? (id)self : self.window;
- if ((!from || !to) || (from == to)) return [self convertPoint:point fromView:view];
- point = [from convertPoint:point fromView:view];
- point = [to convertPoint:point fromWindow:from];
- point = [self convertPoint:point fromView:to];
- return point;
- }
- - (CGRect)convertRect:(CGRect)rect toViewOrWindow:(UIView *)view {
- if (!view) {
- if ([self isKindOfClass:[UIWindow class]]) {
- return [((UIWindow *)self) convertRect:rect toWindow:nil];
- } else {
- return [self convertRect:rect toView:nil];
- }
- }
-
- UIWindow *from = [self isKindOfClass:[UIWindow class]] ? (id)self : self.window;
- UIWindow *to = [view isKindOfClass:[UIWindow class]] ? (id)view : view.window;
- if (!from || !to) return [self convertRect:rect toView:view];
- if (from == to) return [self convertRect:rect toView:view];
- rect = [self convertRect:rect toView:from];
- rect = [to convertRect:rect fromWindow:from];
- rect = [view convertRect:rect fromView:to];
- return rect;
- }
- - (CGRect)convertRect:(CGRect)rect fromViewOrWindow:(UIView *)view {
- if (!view) {
- if ([self isKindOfClass:[UIWindow class]]) {
- return [((UIWindow *)self) convertRect:rect fromWindow:nil];
- } else {
- return [self convertRect:rect fromView:nil];
- }
- }
-
- UIWindow *from = [view isKindOfClass:[UIWindow class]] ? (id)view : view.window;
- UIWindow *to = [self isKindOfClass:[UIWindow class]] ? (id)self : self.window;
- if ((!from || !to) || (from == to)) return [self convertRect:rect fromView:view];
- rect = [from convertRect:rect fromView:view];
- rect = [to convertRect:rect fromWindow:from];
- rect = [self convertRect:rect fromView:to];
- return rect;
- }
- - (CGFloat)left {
- return self.frame.origin.x;
- }
- - (void)setLeft:(CGFloat)x {
- CGRect frame = self.frame;
- frame.origin.x = x;
- self.frame = frame;
- }
- - (CGFloat)top {
- return self.frame.origin.y;
- }
- - (void)setTop:(CGFloat)y {
- CGRect frame = self.frame;
- frame.origin.y = y;
- self.frame = frame;
- }
- - (CGFloat)right {
- return self.frame.origin.x + self.frame.size.width;
- }
- - (void)setRight:(CGFloat)right {
- CGRect frame = self.frame;
- frame.origin.x = right - frame.size.width;
- self.frame = frame;
- }
- - (CGFloat)bottom {
- return self.frame.origin.y + self.frame.size.height;
- }
- - (void)setBottom:(CGFloat)bottom {
- CGRect frame = self.frame;
- frame.origin.y = bottom - frame.size.height;
- self.frame = frame;
- }
- - (CGFloat)width {
- return self.frame.size.width;
- }
- - (void)setWidth:(CGFloat)width {
- CGRect frame = self.frame;
- frame.size.width = width;
- self.frame = frame;
- }
- - (CGFloat)height {
- return self.frame.size.height;
- }
- - (void)setHeight:(CGFloat)height {
- CGRect frame = self.frame;
- frame.size.height = height;
- self.frame = frame;
- }
- - (CGFloat)centerX {
- return self.center.x;
- }
- - (void)setCenterX:(CGFloat)centerX {
- self.center = CGPointMake(centerX, self.center.y);
- }
- - (CGFloat)centerY {
- return self.center.y;
- }
- - (void)setCenterY:(CGFloat)centerY {
- self.center = CGPointMake(self.center.x, centerY);
- }
- - (CGPoint)origin {
- return self.frame.origin;
- }
- - (void)setOrigin:(CGPoint)origin {
- CGRect frame = self.frame;
- frame.origin = origin;
- self.frame = frame;
- }
- - (CGSize)size {
- return self.frame.size;
- }
- - (void)setSize:(CGSize)size {
- CGRect frame = self.frame;
- frame.size = size;
- self.frame = frame;
- }
- @end
|