Как сделать кнопку или метку над CALayer в Xcode?

В свою раскадровку я добавил кнопку и ярлык. В моем ViewController я программно определил CALayer и добавил его в качестве подслоя в представление ViewController. Когда я тестирую приложение, подслой находится над кнопкой и надписью, но я хочу сделать подслой под кнопкой и надписью.


вот код

.h файл

// The CALayer declaration
CALayer *graphic;

.m файл

//The screen width and height
CGRect screenBound = [[UIScreen mainScreen] bounds];
CGSize screenSize = screenBound.size;
CGFloat screenWidth = screenSize.width;
CGFloat screenHeight = screenSize.height;

//The CALayer definition
graphic = [CALayer layer];
graphic.bounds = CGRectMake(0, 0, screenHeight, screenWidth);
graphic.position = CGPointMake(screenHeight/2, screenWidth/2);
graphic.backgroundColor = [UIColor blackColor].CGColor;
graphic.opacity = 0.1f;
[self.view.layer addSublayer:graphic];

Как сделать так, чтобы подслой (графический) отображался под кнопкой и надписью?


заранее спасибо

1 ответ

Решение

Одна вещь, которую вы можете сделать, это добавить свою кнопку и метку программно к вашему слою.

РЕДАКТИРОВАТЬ

Хорошо, я понял, в чем проблема. Когда вы добавили эту строку: [graphic addSublayer:self.btn.layer]; Ваше приложение зависало, потому что ваша кнопка уже была добавлена ​​в иерархию представления, потому что вы создавали ее с помощью раскадровки.

Что я сделал, так это объявил новый ярлык и кнопку, не добавляя их в раскадровку (см. Комментарий "А"). После этого я создал их внутри метода viewDidLoad а затем добавили их в слой, который вы создали.

ПРЕДУПРЕЖДЕНИЕ

Этот код, который я показываю здесь, будет эффективно отображать вашу метку и кнопку в верхней части CALayer Однако имейте в виду, что CALayers используются для рисования и анимации, а не для взаимодействия с пользователем. В отличие от UIView CALayer не наследуется от UIResponder и по этой причине он не может получить прикосновения UIView получает.

Тем не менее, есть обходной путь. Вместо использования механизма Target-Action вы можете использовать Gesture Recognizer, чтобы иметь возможность обнаруживать прикосновения и взаимодействие с пользователем. В этом примере я добавил простой UITapGestureRecognizer чтобы показать, как это делается. Каждый раз, когда вы нажимаете на кнопку, в консоли будет отображаться сообщение "Нажатие кнопки".

// This is the *.m file
#import "ViewController.h"

@interface ViewController ()

// Comment A. Another label and button added to the class without adding them to the
// storyboard
@property (nonatomic, strong) UIButton *firstButton;
@property (nonatomic, strong) UILabel *mylabel;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.firstButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.firstButton setTitle:@"Just a Button" forState:UIControlStateNormal];
    self.firstButton.frame = CGRectMake(50, 50, 300, 40);
    UIGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(theAction:)];
    [self.firstButton addGestureRecognizer:tapGesture];

    self.mylabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 120, 200, 40)];
    self.mylabel.text = @"Hello World";
    self.mylabel.backgroundColor = [UIColor cyanColor];

    //The screen width and height
    CGRect screenBound = [[UIScreen mainScreen] bounds];
    CGSize screenSize = screenBound.size;
    CGFloat screenWidth = screenSize.width;
    CGFloat screenHeight = screenSize.height;

    //The CALayer definition
    CALayer *graphic = nil;
    graphic = [CALayer layer];
    graphic.bounds = CGRectMake(0, 0, screenHeight, screenWidth);
    graphic.position = CGPointMake(screenHeight/2, screenWidth/2);
    graphic.backgroundColor = [UIColor whiteColor].CGColor;
    graphic.opacity = 1.0f;
    [graphic addSublayer:self.firstButton.layer];
    [graphic addSublayer:self.mylabel.layer];
    [self.view.layer addSublayer:graphic];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)theAction:(id)sender {

    NSLog(@"Button Tapped");
}
@end

Дайте мне знать, если у вас есть еще вопросы.

Надеюсь это поможет!

Другие вопросы по тегам