Iphone UIButtonがネストされたUIViewで機能しない
-
03-07-2019 - |
質問
これは非常に簡単です。私は何かを失い、それを修正しようとするのに疲れています。誰かが助けてくれることを願っています。
CharacterView.mのボタンは機能しますが、CharacterMale.mにネストされたボタンは機能しません。私はIBを使用していません。すべてが予言的に行われます。 1つのボタンが機能し、他のボタンが機能しない原因は何ですか?
/////////////////////////////////////////////////////////////////////////////////
CharacterController.m
/////////////////////////////////////////////////////////////////////////////////
#import "CharacterController.h"
#import "CharacterView.h"
@implementation CharacterController
- (id)init {
NSLog(@"CharacterController init");
self = [ super init ];
if (self != nil) {
}
return self;
}
- (void)loadView {
[ super loadView ];
characterView = [ [ CharacterView alloc ] init];
self.view = characterView;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)dealloc {
[super dealloc];
}
@end
/////////////////////////////////////////////////////////////////////////////////
CharacterView.m
/////////////////////////////////////////////////////////////////////////////////
#import "CharacterView.h"
#import "CharacterMale.h"
@implementation CharacterView
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
characterMale = [ [ CharacterMale alloc ] init];
[self addSubview: characterMale];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 200, 200, 100);
[button setImage:[UIImage imageNamed:@"btnCharSelect.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(ApplyImage:) forControlEvents:UIControlEventTouchUpInside];
[ self addSubview: button ];
}
return self;
}
- (void)drawRect:(CGRect)rect {
}
-(void)ApplyImage:(id)sender
{
NSLog(@"CharacterView button works");
}
- (void)dealloc {
[super dealloc];
}
@end
/////////////////////////////////////////////////////////////////////////////////
CharacterMale.m
/////////////////////////////////////////////////////////////////////////////////
#import "CharacterMale.h"
#import "CharacterController.h"
@implementation CharacterMale
- (id)init {
self = [ super init];
if (self != nil) {
UIImage *image = [UIImage imageNamed:@"charMale.png"];
imageView = [[ UIImageView alloc] initWithImage:image];
[image release];
[ self addSubview: imageView ];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 200, 100);
[button setImage:[UIImage imageNamed:@"btnCharSelect.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(ApplyImage:) forControlEvents:UIControlEventTouchUpInside];
[ self addSubview: button ];
}
return self;
}
-(void)ApplyImage:(id)sender
{
NSLog(@"CharacterMal button works");
}
- (void)dealloc {
[super dealloc];
}
@end
解決
最後に!!!!!!
すべてのビューをinitWithFrameで初期化し、有効なフレーム四角形を渡す必要がありました。 InitはコントローラーとinitWithFrameと共に使用され、UIViewの四角形を渡します!!!!
characterView = [ [ CharacterView alloc ] initWithFrame:CGRectMake(0, 0, 480, 320)];
then
characterMale = [ [ CharacterMale alloc ] initWithFrame:frame];
他のヒント
考慮すべきもう1つの点は、 UIImageView
が追加された UIButton
サブビューがまったく機能しないことです。画像ビューとボタンの両方を追加する UIView
を作成する必要があります。
これはおそらく、画像ビューでインタラクションがデフォルトでオフになっているためですが、これをチェックしていません。
新しいビューはユーザーの操作を受け入れますか?言い換えると、userInteractionEnabledはビュー" Characters"で有効になっていますか?
CGRectZeroのフレームでUIViewの初期化中にボタンを追加しようとすると、同様の問題が発生しました:
@implementation SomeView
...
- (id)initWithTitleImage:(UIImage *) newTitleImage {
// BROKEN: frame with CGRectZero.
self = [super initWithFrame:CGRectZero];
if (self) {
UIButton *someButton = ...;
[self addSubview someButton];
}
}
フレームを適切な長方形に変更すると、ボタンが機能しました:
@implementation SomeView
...
- (id)initWithTitleImage:(UIImage *) newTitleImage {
// WORKING: frame with proper CGRect.
self = [super initWithFrame:CGRectMake(0, 0, 480, 320)];
if (self) {
UIButton *someButton = ...;
[self addSubview someButton];
}
}
私は、人気のある UIControlEventTouchUpInside
の代わりに UIControlEventTouchDown
を使用してdrawRectで作成されたUIButtonのセレクターで幸運に恵まれました。
この問題は、ボタンフレームの原点が親フレームよりも大きいために発生しました。