New file |
| | |
| | | // |
| | | // UIView+YYAdd.m |
| | | // YYCategories <https://github.com/ibireme/YYCategories> |
| | | // |
| | | // 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 "YYCategoriesMacro.h" |
| | | |
| | | YYSYNTH_DUMMY_CLASS(UIView_YYAdd) |
| | | |
| | | |
| | | @implementation UIView (YYAdd) |
| | | |
| | | - (UIImage *)snapshotImage { |
| | | 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]; |
| | | } |
| | | 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 |