//
|
// 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
|