できることの 1 つは、ボタンとラベルをプログラムでレイヤーに追加することです。
編集
わかりました、私は問題が何であるかを理解しました。この行を追加したとき:[graphic addSublayer:self.btn.layer];
ストーリーボードを使用してボタンを作成していたため、ボタンがビュー階層に既に追加されていたため、アプリケーションがクラッシュしていました。
私がしたことは、ストーリーボードに追加せずに新しいラベルとボタンを宣言することでした (コメント「A」を参照)。その後、メソッド内でそれらをインスタンス化しviewDidLoad
、作成したレイヤーに追加しました。
警告
ここで示しているこのコードは、効果的にラベルとボタンを の上に表示しますが、 はユーザーの操作ではなく、描画とアニメーションに使用されるCALayer
ことに注意してください。CALayer
a とは異なり、UIView
aCALayer
は継承しない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
ご不明な点がございましたら、お気軽にお問い合わせください。
お役に立てれば!