Ответ 1
Поместите UIView поверх фона, установите его фон на [UIColor blackColor]
и установите его непрозрачность как 0.6. Затем добавьте этот UIView в родительский вид.
Это погаснет фон и перехватит любые краны в фоновые элементы управления.
В моем основном представлении я делаю какое-то действие жестов, вызывая отображение какого-либо нового представления. В это время я хочу сгладить весь фон (кроме этого нового представления) в качестве хорошей практики пользовательского интерфейса. В HTML, Javascript это выглядит так: как мне получить такой же эффект в iOS?
Поместите UIView поверх фона, установите его фон на [UIColor blackColor]
и установите его непрозрачность как 0.6. Затем добавьте этот UIView в родительский вид.
Это погаснет фон и перехватит любые краны в фоновые элементы управления.
В то время как предложение Dan предназначено, вы не можете использовать контроллер модального представления в этом случае, потому что типичный модальный охватывает весь экран, блокируя родительский контроллер представления, даже если у вас есть фон вашего представления как прозрачный (вы будете см. все, что у вас есть в приложении UIWindow).
Если вы делаете это на iPad, есть 2 модальных стиля презентации (UIViewModalPresentationStylePageSheet
и UIViewModalPresentationStyleFormSheet
), которые могут сделать что-то подобное, но они не будут работать на iPhone или iPod Touch.
Добавьте представление "тень" с темным фоном и частичной непрозрачностью и любым видом, который вы хотите видеть на переднем плане, прямо в представлении контроллера просмотра. Вы можете анимировать их при использовании стандартных блоков анимации UIView или CoreAnimation.
Еще одно замечание: если вы хотите перехватить штрихи в этом теневом представлении, вы можете либо сделать его гигантской кнопкой, подкласс UIView, чтобы переопределить один из методов touch, например touchesEnded:
, или изменить его на UIControl, который может получать события касания, такие как UIButton, но без дополнительных опций для текста, теней, состояний и т.д.
Вышеупомянутые два ответа работают, если новое представление имеет собственный "фон", то есть не имеет прозрачности. Проблема, которая привела меня сюда, не может быть решена таким образом, хотя, что я пытался сделать, так это: я запускаю AVCaptureSession
на своем экране с обычным AVCaptureVideoPreviewLayer
для отображения видео в реальном времени. Я хочу выбрать часть экрана (чтобы позже сделать что-то только с этой частью), и когда эта часть будет выбрана, вы хотите уменьшить ту часть предварительного просмотра видео. Это выглядит так:
Вот как я решил это: новый вид создается в зависимости от того, где экран был затронут и добавлен в качестве подвид представления просмотра видео. Затем я создаю 4 дополнительных, неперекрывающихся прямоугольных поднабора с указанным выше цветом фона и непрозрачностью, чтобы покрыть остальную часть экрана. Я явно нуждаюсь во всех этих представлениях, чтобы они не были в представлении основного представления, потому что мне нужна возможность прикоснуться к экрану в другом месте и изменить выбранную область.
Я уверен, что есть более элегантные способы решения этой проблемы, поэтому, если кто-то знает, как прокомментировать...
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UIGestureRecognizerDelegate>
{
UIView *mainView;
UIView *dimBackgroundUIView;
UIView *customView;
UIButton *btn;
}
@end
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
mainView = [[UIView alloc] init];
mainView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:mainView];
[self addConstraintsForMainView];
btn = [[UIButton alloc] initWithFrame:CGRectMake(200, 200, 100, 30)];
[btn setTitle:@"Button" forState:UIControlStateNormal];
[btn setBackgroundColor:[UIColor blueColor]];
[btn addTarget:self action:@selector(showCustomView_Action:) forControlEvents:UIControlEventTouchUpInside];
[mainView addSubview:btn];
dimBackgroundUIView = [[UIView alloc] init];
dimBackgroundUIView.backgroundColor = [UIColor blackColor];
dimBackgroundUIView.alpha = 0.2;
}
-(void)removeCustomViewsFromSuperView {
if(dimBackgroundUIView)
[dimBackgroundUIView removeFromSuperview];
if(customView)
[customView removeFromSuperview];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)showCustomView_Action:(id)sender {
customView = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 80, 80)];
customView.backgroundColor = [UIColor redColor];
[self.view addSubview:dimBackgroundUIView];
[self addConstraintsForDimView];
[self.view addSubview:customView];
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeCustomViewsFromSuperView)];
tapped.delegate=self;
tapped.numberOfTapsRequired = 1;
[customView addGestureRecognizer:tapped];
}
-(void) addConstraintsForDimView {
[dimBackgroundUIView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:dimBackgroundUIView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:dimBackgroundUIView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1 constant:0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:dimBackgroundUIView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:dimBackgroundUIView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]];
}
-(void) addConstraintsForMainView {
[mainView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:mainView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:mainView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1 constant:0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:mainView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:mainView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:0]];
}
@end
Примечание: вы можете оптимизировать код с помощью графического интерфейса на Xcode, но мне пришлось писать код программно, чтобы проверить его
, поэтому идея заключается в следующем: