3

ストーリーボードにボタンとラベルを追加しました。私の 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];

サブレイヤー (グラフィック) をボタンとラベルの下に表示するにはどうすればよいですか?


前もって感謝します

4

1 に答える 1

1

できることの 1 つは、ボタンとラベルをプログラムでレイヤーに追加することです。

編集

わかりました、私は問題が何であるかを理解しました。この行を追加したとき:[graphic addSublayer:self.btn.layer];ストーリーボードを使用してボタンを作成していたため、ボタンがビュー階層に既に追加されていたため、アプリケーションがクラッシュしていました。

私がしたことは、ストーリーボードに追加せずに新しいラベルとボタンを宣言することでした (コメント「A」を参照)。その後、メソッド内でそれらをインスタンス化しviewDidLoad、作成したレイヤーに追加しました。

警告

ここで示しているこのコードは、効果的にラベルとボタンを の上に表示しますが、 はユーザーの操作ではなく、描画とアニメーションに使用されるCALayerことに注意してください。CALayera とは異なり、UIViewaCALayerは継承しないUIResponderため、a が受け取るタッチを受け取ることができません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

ご不明な点がございましたら、お気軽にお問い合わせください。

お役に立てれば!

于 2013-10-18T18:45:02.217 に答える