mirror of
https://github.com/danog/Telegram.git
synced 2024-12-03 09:57:46 +01:00
232 lines
8.0 KiB
Objective-C
232 lines
8.0 KiB
Objective-C
#import "TGMenuSheetDimView.h"
|
|
#import "TGMenuSheetView.h"
|
|
|
|
@interface TGMenuSheetCutoutView : UIImageView
|
|
|
|
@end
|
|
|
|
@implementation TGMenuSheetCutoutView
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self != nil)
|
|
{
|
|
static dispatch_once_t onceToken;
|
|
static UIImage *image;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
CGRect rect = CGRectMake(0, 0, TGMenuSheetCornerRadius * 2, TGMenuSheetCornerRadius * 2);
|
|
|
|
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0);
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
CGContextSetFillColorWithColor(context, [TGMenuSheetDimView backgroundColor].CGColor);
|
|
CGContextFillRect(context, rect);
|
|
|
|
CGContextSetBlendMode(context, kCGBlendModeClear);
|
|
|
|
CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor);
|
|
CGContextFillEllipseInRect(context, rect);
|
|
|
|
image = [UIGraphicsGetImageFromCurrentImageContext() resizableImageWithCapInsets:UIEdgeInsetsMake(TGMenuSheetCornerRadius, TGMenuSheetCornerRadius, TGMenuSheetCornerRadius, TGMenuSheetCornerRadius)];
|
|
|
|
UIGraphicsEndImageContext();
|
|
});
|
|
|
|
self.image = image;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@interface TGMenuSheetDimView ()
|
|
{
|
|
UIView *_topView;
|
|
UIView *_leftView;
|
|
UIView *_rightView;
|
|
UIView *_bottomView;
|
|
UIView *_firstDividerView;
|
|
UIView *_secondDividerView;
|
|
|
|
UIView *_firstCutoutView;
|
|
UIView *_secondCutoutView;
|
|
UIView *_thirdCutoutView;
|
|
}
|
|
|
|
@property (nonatomic, weak) TGMenuSheetView *menuView;
|
|
|
|
@end
|
|
|
|
@implementation TGMenuSheetDimView
|
|
|
|
- (instancetype)initWithActionMenuView:(TGMenuSheetView *)menuView
|
|
{
|
|
self = [super initWithFrame:CGRectZero];
|
|
if (self != nil)
|
|
{
|
|
self.menuView = menuView;
|
|
|
|
void (^setupView)(UIView *) = ^(UIView *view)
|
|
{
|
|
view.userInteractionEnabled = false;
|
|
view.backgroundColor = [TGMenuSheetDimView backgroundColor];
|
|
};
|
|
|
|
if (TGMenuSheetUseEffectView)
|
|
{
|
|
_topView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
[self addSubview:_topView];
|
|
|
|
_leftView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
[self addSubview:_leftView];
|
|
|
|
_rightView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
[self addSubview:_rightView];
|
|
|
|
_bottomView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
[self addSubview:_bottomView];
|
|
|
|
for (UIView *view in self.subviews)
|
|
setupView(view);
|
|
|
|
_firstDividerView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
setupView(_firstDividerView);
|
|
|
|
_secondDividerView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
setupView(_secondDividerView);
|
|
|
|
_firstCutoutView = [[TGMenuSheetCutoutView alloc] initWithFrame:CGRectZero];
|
|
_secondCutoutView = [[TGMenuSheetCutoutView alloc] initWithFrame:CGRectZero];
|
|
_thirdCutoutView = [[TGMenuSheetCutoutView alloc] initWithFrame:CGRectZero];
|
|
}
|
|
else
|
|
{
|
|
_topView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
[self addSubview:_topView];
|
|
setupView(_topView);
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)layoutSubviews
|
|
{
|
|
if (!TGMenuSheetUseEffectView)
|
|
{
|
|
_topView.frame = CGRectMake(-self.frame.size.width, -self.frame.size.height, self.frame.size.width * 3, self.frame.size.height * 3);
|
|
return;
|
|
}
|
|
|
|
TGMenuSheetView *menuView = self.menuView;
|
|
if (menuView == nil)
|
|
return;
|
|
|
|
NSMutableArray *rects = [[NSMutableArray alloc] init];
|
|
__block NSValue *unionRect = nil;
|
|
UIEdgeInsets edgeInsets = menuView.edgeInsets;
|
|
CGFloat spacing = menuView.interSectionSpacing;
|
|
|
|
void (^addRect)(NSValue *) = ^(NSValue *rectValue)
|
|
{
|
|
if (rectValue == nil)
|
|
return;
|
|
|
|
[rects addObject:rectValue];
|
|
|
|
if (unionRect == nil)
|
|
unionRect = rectValue;
|
|
else
|
|
unionRect = [NSValue valueWithCGRect:CGRectUnion(unionRect.CGRectValue, rectValue.CGRectValue)];
|
|
};
|
|
|
|
addRect(menuView.headerFrame);
|
|
addRect(menuView.mainFrame);
|
|
addRect(menuView.footerFrame);
|
|
|
|
CGFloat menuWidth = unionRect.CGRectValue.size.width;
|
|
CGFloat topEdge = self.frame.size.height - menuView.menuHeight;
|
|
CGFloat leftEdge = edgeInsets.left;
|
|
CGFloat rightEdge = menuView.menuWidth - edgeInsets.right;
|
|
CGFloat bottomEdge = self.frame.size.height - edgeInsets.bottom;
|
|
|
|
CGRect firstRect = [rects.firstObject CGRectValue];
|
|
|
|
_topView.frame = CGRectMake(leftEdge, -self.frame.size.height, menuWidth, self.frame.size.height + topEdge + firstRect.origin.y);
|
|
_leftView.frame = CGRectMake(0, -self.frame.size.height, leftEdge, self.frame.size.height * 3);
|
|
_rightView.frame = CGRectMake(rightEdge, -self.frame.size.height, edgeInsets.right, self.frame.size.height * 3);
|
|
_bottomView.frame = CGRectMake(leftEdge, bottomEdge, menuWidth, self.frame.size.height);
|
|
|
|
switch (rects.count)
|
|
{
|
|
case 1:
|
|
{
|
|
CGRect rect = [rects.firstObject CGRectValue];
|
|
|
|
if (_firstCutoutView.superview == nil)
|
|
[self addSubview:_firstCutoutView];
|
|
_firstCutoutView.frame = CGRectMake(leftEdge, topEdge + rect.origin.y, rect.size.width, rect.size.height);
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
{
|
|
CGRect rect1 = [rects.firstObject CGRectValue];
|
|
CGRect rect2 = [rects.lastObject CGRectValue];
|
|
|
|
if (_firstCutoutView.superview == nil)
|
|
[self addSubview:_firstCutoutView];
|
|
_firstCutoutView.frame = CGRectMake(leftEdge, topEdge + rect1.origin.y, rect1.size.width, rect1.size.height);
|
|
|
|
if (_secondCutoutView.superview == nil)
|
|
[self addSubview:_secondCutoutView];
|
|
_secondCutoutView.frame = CGRectMake(leftEdge, topEdge + rect2.origin.y, rect2.size.width, rect2.size.height);
|
|
|
|
if (_firstDividerView.superview == nil)
|
|
[self addSubview:_firstDividerView];
|
|
_firstDividerView.frame = CGRectMake(leftEdge, topEdge + CGRectGetMaxY(rect1), menuWidth, spacing);
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
{
|
|
CGRect rect1 = [rects.firstObject CGRectValue];
|
|
CGRect rect2 = [rects[1] CGRectValue];
|
|
CGRect rect3 = [rects.lastObject CGRectValue];
|
|
|
|
if (_firstCutoutView.superview == nil)
|
|
[self addSubview:_firstCutoutView];
|
|
_firstCutoutView.frame = CGRectMake(leftEdge, topEdge + rect1.origin.y, rect1.size.width, rect1.size.height);
|
|
|
|
if (_secondCutoutView.superview == nil)
|
|
[self addSubview:_secondCutoutView];
|
|
_secondCutoutView.frame = CGRectMake(leftEdge, topEdge + rect2.origin.y, rect2.size.width, rect2.size.height);
|
|
|
|
if (_thirdCutoutView.superview == nil)
|
|
[self addSubview:_thirdCutoutView];
|
|
_thirdCutoutView.frame = CGRectMake(leftEdge, topEdge + rect3.origin.y, rect3.size.width, rect3.size.height);
|
|
|
|
if (_firstDividerView.superview == nil)
|
|
[self addSubview:_firstDividerView];
|
|
_firstDividerView.frame = CGRectMake(leftEdge, topEdge + CGRectGetMaxY(rect1), menuWidth, spacing);
|
|
|
|
if (_secondDividerView.superview == nil)
|
|
[self addSubview:_secondDividerView];
|
|
_secondDividerView.frame = CGRectMake(leftEdge, rect3.origin.y - edgeInsets.top, menuWidth, spacing);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ (UIColor *)backgroundColor
|
|
{
|
|
return [UIColor colorWithWhite:0.0f alpha:0.4f];
|
|
}
|
|
|
|
@end
|