将子视图(UIButtons)添加到UIImageView的子类时出现问题

时间:2009-12-23 22:39:02

标签: iphone cocoa-touch uiview uiimageview uibutton

我正在为我的应用添加自定义按钮/键盘。到目前为止,我有一个UIImageView子类,其中包含一个动画,可以从屏幕底部滑动,然后在用户不再需要时向下滑动。但是,我无法将UIButtons添加到此UIImageView中。

由于这是UIView的子类,我试图通过initWithFrame:方法向我的视图添加按钮。 (slideDown方法是添加的动画)

在我的UIImageView子类中,我添加了一个UIButton ivar对象:

-(id)initWithFrame:(CGRect)frame {

  if (self = [super initWithFrame: frame]) {
  UIButton *button = [UIButton buttonWithType: UIButtonTypeRoundedRect];
  button.frame = CGRectMake(16.0, 20.0, 50.0, 50.0);
  [button setTitle: @"Go" forState: UIControlStateNormal];
  [button addTarget: self action: @selector(slideDown) forControlEvents: UIControlEventTouchUpInside];
  self.button1 = button;
   [self addSubview: button1];
   NSLog(@"Button added");

}
return self;
}

在我的视图控制器中,我在 - (void)viewDidLoad:方法中实例化我的UIIMageView子类,如下所示:

-(void)viewDidLoad {
//other objects init'ed

ButtonPad *customPad = [[ButtonPad alloc] initWithImage: [UIImage imageNamed: @"ButtonPad.png"]];
customPad.frame = CGRectMake(0.0, 480.0, 320.0, 300.0);
self.buttonPad = customPad;

[self.view addSubview: buttonPad];
[customPad release];  

[super viewDidLoad];
}

我当前的应用程序允许视图从屏幕上下滑动而没有任何问题。但是,按钮永远不会出现。我还尝试通过实例化&添加按钮到我的buttonPad对象。将其作为子视图添加到视图控制器文件中的buttonPad。这有效...但它不允许按钮起作用。

我想知道: A.)是否适合向UIView initWithFrame:方法添加按钮或任何子视图,或者我应该将这些子视图作为子视图添加到视图控制器文件中的buttonPad? B.)因为我正在创建一个自定义按钮/键盘,我是通过使用普通的UIViewController遵循有效的方法还是我应该使用像模态视图控制器? (我对这些知之甚少。)

4 个答案:

答案 0 :(得分:7)

我认为你的问题是UIImageView默认禁用了userInteractionEnabled属性。您可以尝试添加行
customPad.userInteractionEnabled = true;
初始化并设定。

答案 1 :(得分:1)

我看到一个小错误:

UIbutton *button = [[UIButton alloc] initWithFrame:CGRectMake(16.0, 20.0, 50.0, 50.0);
button.buttonType = UIButtonTypeRoundedRect;

将其添加到以下内容:

 UIButton *button = [UIButton buttonWithType: UIButtonTypeRoundedRect];

该错误导致按钮永远不会被分配,如果它不起作用,您可能需要将按钮放在UIView内。 希望这会有所帮助。

答案 2 :(得分:1)

您是否正在从nib文件加载UIImageView子类?如果是,则不会调用-initWithFrame:,而是调用-initWithCoder:

我通常做的是:

- (void)didInit {
    // add your buttons here
}
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self didInit];
    }
    return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self didInit];
    }
    return self;
}

答案 3 :(得分:1)

突破:我注意到的一个问题是在我的视图控制器中,我使用initWithImage来实例化我的UIImageView而不是使用initWithFrame:这导致图像被加载,而不是按钮。现在按钮出现但不起作用。

查看控制器文件现在看起来像这样:

-(void)viewDidLoad {
//other objects init'ed here.

ButtonPad *customPad = [[ButtonPad alloc] initWithFrame: CGRectMake(0.0, 480.0, 320.0, 300.0)];
customPad.image = [UIImage imageNamed: @"ButtonPad.png"];
self.buttonPad = customPad;

[self.view addSubview: buttonPad];
[customPad release];

[super viewDidLoad];  
}

这分配&初始化使用我的UIIMageView子类中的重写方法的帧。任何帮助让按钮工作都将非常感激。