Intereting Posts
Более длинные субтитры в аннотациях MapView (быстрый) Переупорядочение UITableViewCells приводит к разрыву содержимого ячейки Как я могу выбрать номер контактного телефона в iOS? Блокировка или маскирование или Шторка черной дыры для ARKit Catch / guard crash ранее для ? Watchkit OS 2, WCSession работает в фоновом режиме Воспроизведение AVUSsetResourceLoader при воспроизведении AVURLAsset происходит только через AirPlay использование AVSystemController в приложении iPhone iOS: как обмениваться данными между различными представлениями контроллера панели вкладок Программно установите анимацию UIImage с помощью WatchKit Удалены все сертификаты / ключи и теперь не могут получать push-уведомления для приложения, развернутого в магазине приложений как создать базу данных sqlite в ios swift без какого-либо класса-оболочки и использовать его Как связать представление таблицы с несколькими разделами, которые представляют разные типы данных, используя RxSwift и RxSwiftDataSources? Как изменить размер представлений после типа UIContentSizeCategoryDidChangeNotification динамического типа Различные сертификаты Apple

создать прозрачное отверстие четверти в правом нижнем углу на оверлейном UIView

Привет, я хочу создать четверть прозрачного отверстия в правом нижнем углу на оверлейном UIView.

Я могу решить это, используя код ниже. Но это не выглядит правильным, поскольку я создаю прямоугольник за пределами видимости.

Что я пробовал:

@implementation PartialTransparentView - (id)initWithBottomRightCornerRadiusForView:(UIView *)view withRadius:(CGFloat)radius { [self commonInitWithRect:CGRectMake(view.frame.size.width - radius, view.frame.size.height - radius, radius*2, radius*2)]; self = [super initWithFrame:CGRectMake(0, 0, 5000, 5000)];//**it does not look right to me** if (self) { // Initialization code self.opaque = NO; } return self; } -(void)commonInitWithRect:(CGRect)rect{ backgroundColor = [UIColor colorWithWhite:1 alpha:0.75]; rectToBeSurrounded = rect; } - (void)drawRect:(CGRect)rect { [backgroundColor setFill]; UIRectFill(rect); CGFloat x = rectToBeSurrounded.origin.x; CGFloat y = rectToBeSurrounded.origin.y; CGFloat width = rectToBeSurrounded.size.width; CGFloat height = rectToBeSurrounded.size.height; //create outer square CGFloat outerX = (x - width/2); CGFloat outerY = y - height/2; CGFloat outerWidth = 2*width; CGFloat outerHeight = outerWidth; //create outer square CGRect outerRect = CGRectMake(outerX, outerY, outerWidth, outerHeight); CGRect holeRectIntersection = CGRectIntersection( outerRect, rect ); CGContextRef context = UIGraphicsGetCurrentContext(); if( CGRectIntersectsRect( holeRectIntersection, rect ) ) { CGContextAddEllipseInRect(context, holeRectIntersection); CGContextClip(context); CGContextClearRect(context, holeRectIntersection); CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor ); CGContextFillRect( context, holeRectIntersection); } } 

Теперь я использую код выше:

 PartialTransparentView *transparentView = [[PartialTransparentView alloc] initWithBottomRightCornerRadiusForView:self.view withRadius:50]; [self.view addSubview:transparentView]; 

Результат, как ожидалось:

ВЫВОД

Я знаю, что мое решение сломается, если мне нужно добиться того же, но в верхнем левом углу. то, что я ищу, просто предоставляет центр (x, y) и радиус для круга и получает желаемые результаты.

Спасибо Basd за Mr.T

 UIView *transparentView = [[UIView alloc] initWithFrame:self.view.frame]; [transparentView setBackgroundColor:[UIColor colorWithWhite:1 alpha:0.75]]; [self.view addSubview:transparentView]; circleView *acircleView = [[circleView alloc] initWithFrame:CGRectMake(50, 50, 60, 60)]; [acircleView setBackgroundColor:[UIColor grayColor]]; [transparentView addSubview:acircleView]; 

и circleView.m

 - (void)drawRect:(CGRect)rect { // Drawing code //// Oval Drawing UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(50, 50, 60, 60)]; [UIColor.grayColor setFill]; [ovalPath fill]; } 

вывод: не получаю круг, вместо этого я получаю квадрат

Мои предложения – добавить прозрачный view в виде отдельного view на вашем контроллере. Это можно сделать либо на storyboard , чтобы вы могли установить цвет фона и значение alpha чтобы получить прозрачный эффект!

Теперь создайте еще один view чтобы сделать круг и добавить его в прозрачный view , и переместите это view на прозрачный view соответствии с вашими потребностями !!!

Создайте круг, используя bezier path :

circleView.m

  - (void)drawRect:(CGRect)frame { //// Oval Drawing UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(CGRectGetMinX(frame), CGRectGetMinY(frame), 60, 60)]; [UIColor.grayColor setFill]; [ovalPath fill]; } 

Для целей тестирования я создал круг в моем IB и создал свойство outlet в моем контроллере.

HERE – скриншот.

введите описание изображения здесь

Теперь, чтобы переместить круг, я могу просто изменить рамку круга, где бы я ни нуждался.

Например, если я хочу переместить его в левую верхнюю часть, я просто делаю:

 -(void)moveCircleViewwithX:(float) x withY:(float) y{ _cView.frame=CGRectMake(x, y, _cView.frame.size.width, _cView.frame.size.height); } 

Результатом будет:

введите описание изображения здесь

Обновить

Поместите следующий метод drawRect прозрачности:

 CGContextRef ctx = UIGraphicsGetCurrentContext(); CGRect transparentPart = self.seeRect; //this is the rect of the circle view CGContextAddEllipseInRect(ctx,transparentPart); //make the circle shape CGContextClip(ctx); CGContextClearRect(ctx, transparentPart); 

и, по вашему мнению, контроллер:

когда вы хотите применить маску, т.е. прозрачную для круга и для прозрачного слоя:

 -(void)applyMask{ [_cView setCircleColor:[UIColor clearColor]]; //circle view bezier path color [_cView setNeedsDisplay]; [_tView setSeeRect:_cView.frame]; //set the transparency cut on transparency view [_tView setNeedsDisplay]; } 

Как только вы это сделаете, вы получите представление прозрачности !!!

Вы можете перемещать круг, просто называя

  [self moveCircleViewwithX:-30 withY:10]; //top left corner 

и вы можете применить маску прозрачности, просто позвонив:

  [self applyMask]; 

Итак, конечный результат после вызова метода applyMask будет следующим:

введите описание изображения здесь