我正在为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不再被调用了。为什么?以及如何解决它?
答案 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应用于此属性