在屏幕外添加UIButton

时间:2009-11-06 02:57:37

标签: iphone cocoa-touch uibutton

我正在为UIView动态创建和添加UIButton,例如:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
btn.frame = CGRectMake(100, 10, btn.bounds.size.width, btn.bounds.size.height);
[btn addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside];
[myView addSubview:btn];

这可以正常工作,myAction被调用。问题开始于我将其添加到可见myView的外部,如:

btn.frame = CGRectMake(-100, 10, btn.bounds.size.width, btn.bounds.size.height);

稍后,我将myView设置为屏幕动画以使btn可见:

[UIView beginAnimations:nil context:NULL];
[myView layer].frame = CGRectMake(320, 0, 320, 48);
[UIView commitAnimations];

但问题是,myAction不再被调用了。为什么?以及如何解决它?

3 个答案:

答案 0 :(得分:3)

您对Art的答案的评论几乎解释了这个问题。你有一个在父母可见区域之外的按钮;如果父母的位置使得按钮在堆叠上可见更高,则无关紧要。按钮被修剪而没有画。

你有两个选择。

1)使myView的框架更大,并适当调整所有坐标。 myView总会在屏幕外显示一些内容,屏幕上显示一些内容,您只需将其放置在您想要的位置即可。当按钮在屏幕上时,它将是可见的。 (例如,在你的代码上面,myView的初始框架会从x的某个负值开始并延伸到比iPhone屏幕宽得多,而你的btn将位于相对于myView左上角的某个正x,y位置然后你移动myView,例如,它移动到0,0,在屏幕上移动btn时将其部分内容推到屏幕外。)

2)不要在myView上放置按钮;将它设置为一个新视图,在动画myView 时动画

#1的简单代码:

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(-100, 0, 420, 480)]; // start 100 pixels to the left
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
    btn.frame = CGRectMake(0, 10, btn.bounds.size.width, btn.bounds.size.height);
    [myView addSubview:btn];

    UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn1 setTitle:@"DoIt" forState:UIControlStateNormal];
    btn1.frame = CGRectMake(100, 100, 50, 50);
    [btn1 addTarget:self action:@selector(doit:) forControlEvents:UIControlEventTouchUpInside];
    [myView addSubview:btn1];
    self.view = myView;
}

- (void) doit: (id) bt {
    [UIView beginAnimations:nil context:NULL];
    self.view.frame = CGRectMake(100, 0, 420, 480);
    [UIView commitAnimations];
}

答案 1 :(得分:1)

我在代码中注意到的两件事:

首先,由于frame相对于视图的超级视图,而不是主屏幕btn.frame不应位于屏幕外位置,而应位于myView的相对位置。假设myView已经位于某个负x位置,按钮也会在那里。

其次,当您使用Core Animation时,您应该设置要设置动画的UIView属性,而不是UIView的图层属性。

我测试了这个以确保,这是我的代码:

[super viewDidLoad];
offscreenView = [[UIView alloc] initWithFrame:CGRectMake(-100, 0, 200, 200)];
offscreenView.backgroundColor = [UIColor blueColor];
UIButton * btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
//note we put this at 10, 10 *relative to the button's superview*
btn.frame = CGRectMake(10.0, 10.0, 50.0, 25.0);
[btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[offscreenView addSubview:btn];
[self.view addSubview:offscreenView];
[UIView beginAnimations:@"animateVIew" context:self];
offscreenView.frame = CGRectMake(0.0, 0.0, 200, 200);
[UIView setAnimationDuration:2.0];
[UIView commitAnimations];

希望有所帮助!

答案 2 :(得分:1)

CALayer具有CATransform3D属性

[[btn layer] setTransform:CATransform3DMakeTranslation(-100, 0, 0)];

您可以将CAAnimation应用于此属性