Подтвердить что ты не робот

Исходный фон iOS при просмотре представления

В моем основном представлении я делаю какое-то действие жестов, вызывая отображение какого-либо нового представления. В это время я хочу сгладить весь фон (кроме этого нового представления) в качестве хорошей практики пользовательского интерфейса. В HTML, Javascript это выглядит так: как мне получить такой же эффект в iOS?

enter image description here

4b9b3361

Ответ 1

Поместите UIView поверх фона, установите его фон на [UIColor blackColor] и установите его непрозрачность как 0.6. Затем добавьте этот UIView в родительский вид.

Это погаснет фон и перехватит любые краны в фоновые элементы управления.

Ответ 2

В то время как предложение Dan предназначено, вы не можете использовать контроллер модального представления в этом случае, потому что типичный модальный охватывает весь экран, блокируя родительский контроллер представления, даже если у вас есть фон вашего представления как прозрачный (вы будете см. все, что у вас есть в приложении UIWindow).

Если вы делаете это на iPad, есть 2 модальных стиля презентации (UIViewModalPresentationStylePageSheet и UIViewModalPresentationStyleFormSheet), которые могут сделать что-то подобное, но они не будут работать на iPhone или iPod Touch.

Добавьте представление "тень" с темным фоном и частичной непрозрачностью и любым видом, который вы хотите видеть на переднем плане, прямо в представлении контроллера просмотра. Вы можете анимировать их при использовании стандартных блоков анимации UIView или CoreAnimation.

Еще одно замечание: если вы хотите перехватить штрихи в этом теневом представлении, вы можете либо сделать его гигантской кнопкой, подкласс UIView, чтобы переопределить один из методов touch, например touchesEnded:, или изменить его на UIControl, который может получать события касания, такие как UIButton, но без дополнительных опций для текста, теней, состояний и т.д.

Ответ 3

Вышеупомянутые два ответа работают, если новое представление имеет собственный "фон", то есть не имеет прозрачности. Проблема, которая привела меня сюда, не может быть решена таким образом, хотя, что я пытался сделать, так это: я запускаю AVCaptureSession на своем экране с обычным AVCaptureVideoPreviewLayer для отображения видео в реальном времени. Я хочу выбрать часть экрана (чтобы позже сделать что-то только с этой частью), и когда эта часть будет выбрана, вы хотите уменьшить ту часть предварительного просмотра видео. Это выглядит так:

Вот как я решил это: новый вид создается в зависимости от того, где экран был затронут и добавлен в качестве подвид представления просмотра видео. Затем я создаю 4 дополнительных, неперекрывающихся прямоугольных поднабора с указанным выше цветом фона и непрозрачностью, чтобы покрыть остальную часть экрана. Я явно нуждаюсь во всех этих представлениях, чтобы они не были в представлении основного представления, потому что мне нужна возможность прикоснуться к экрану в другом месте и изменить выбранную область.

Я уверен, что есть более элегантные способы решения этой проблемы, поэтому, если кто-то знает, как прокомментировать...

Ответ 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, но мне пришлось писать код программно, чтобы проверить его

, поэтому идея заключается в следующем:

  • создайте имя UIView, это то, что вы хотите (dimBackgroundUIView), чем установлено цвет фона как черный и установите альфа 0,1 или 0,2 или....
  • добавьте эту 2 строки кода, когда вам нужно сгладить фон: [self.view addSubview: dimBackgroundUIView]; [self addConstraintsForDimView];
  • и добавьте эту 2 строки кода, если вы хотите удалить затемнение background: if (dimBackgroundUIView) [dimBackgroundUIView removeFromSuperview];