Ios 以编程方式添加的子视图不';不能与其他视图交互,但xib添加的视图工作正常
哈兰哈斯金斯写道: 我在viewDidLoad中添加了一个名为userSlider programmaticaly的视图:Ios 以编程方式添加的子视图不';不能与其他视图交互,但xib添加的视图工作正常,ios,uiview,touch,touchesmoved,Ios,Uiview,Touch,Touchesmoved,哈兰哈斯金斯写道: 我在viewDidLoad中添加了一个名为userSlider programmaticaly的视图: self.userSlider = [[UserSliderView alloc] initWithFrame:CGRectMake(0, -120, 320, 155)]; [self.userSlider setUser:user]; [self.userSlider configureView]; [self.view addSubvi
self.userSlider = [[UserSliderView alloc] initWithFrame:CGRectMake(0, -120, 320, 155)];
[self.userSlider setUser:user];
[self.userSlider configureView];
[self.view addSubview:self.userSlider];
还有一个叫做gameTableView的tableview
我最初将userSlider作为自定义视图添加到xib中(因为userSlider有自己的xib),当我实现这些触摸方法时:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = (UITouch*)[touches anyObject];
start = [touch locationInView:self.view].y;
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
if(start < 0)
{
return;
}
UITouch *touch = (UITouch *)[touches anyObject];
CGFloat now = [touch locationInView:self.view].y;
CGFloat diff = now - start;
sliderDirectionIsUp = diff < 0; //sliderDirectionIsUp is a BOOL
if ((self.userSlider.frame.origin.y == 0) && ((now < 120) || (now > 155))) {
return;
}
float newCenterY = self.userSlider.center.y + diff;
if (newCenterY < roundf(self.userSlider.frame.size.height / 2)) {
self.userSlider.center = CGPointMake(self.userSlider.center.x, newCenterY);
CGRect tableViewFrame = self.gameTableView.frame;
tableViewFrame.origin.y += diff;
tableViewFrame.size.height -= diff;
[self.gameTableView setFrame:tableViewFrame];
}
start = now;
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGRect tableViewFrame = self.gameTableView.frame;
if (sliderDirectionIsUp)
{
tableViewFrame.origin.y = 28;
tableViewFrame.size.height = (self.view.frame.size.height - tableViewFrame.origin.y);
//animate userSlider out of visible area
[UIView animateWithDuration:.3 animations:^{
self.userSlider.center = CGPointMake(self.userSlider.center.x, -roundf(self.userSlider.bounds.size.height/2.) + 35);
[self.gameTableView setFrame:tableViewFrame];
}];
}
else if(start >= 0)
{
tableViewFrame.origin.y = (self.userSlider.frame.size.height - 7);
tableViewFrame.size.height = (self.view.frame.size.height - tableViewFrame.origin.y);
//animate userSlider with top to mainviews top
[UIView animateWithDuration:.3 animations:^{
self.userSlider.center = CGPointMake(self.userSlider.center.x, roundf(self.userSlider.bounds.size.height/2.) - 0.5);
[self.gameTableView setFrame:tableViewFrame];
}];
}
}
-(void)touchesbeated:(NSSet*)toucheevent:(UIEvent*)event{
UITouch*触摸=(UITouch*)[触摸任何对象];
开始=[touch locationInView:self.view].y;
}
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件{
如果(开始<0)
{
返回;
}
UITouch*触摸=(UITouch*)[触摸任何对象];
CGFloat now=[touch locationInView:self.view].y;
CGFloat diff=现在-开始;
sliderDirectionIsUp=diff<0;//sliderDirectionIsUp是一个BOOL
if((self.userSlider.frame.origin.y==0)和((现在<120)| |(现在>155))){
返回;
}
float newCenterY=self.userSlider.center.y+diff;
if(newCenterY=0)
{
tableViewFrame.origin.y=(self.userSlider.frame.size.height-7);
tableViewFrame.size.height=(self.view.frame.size.height-tableViewFrame.origin.y);
//使用从上到主视图的方式设置用户滑块的动画
[UIView animateWithDuration:.3个动画:^{
self.userSlider.center=CGPointMake(self.userSlider.center.x,roundf(self.userSlider.bounds.size.height/2.)-0.5);
[self.gameTableView设置框架:tableViewFrame];
}];
}
}
然后这两种观点都会改变我的想法
但是现在,当我以编程方式添加它时,突然间,除非我在移动它之后点击区域内部,否则tableView不会改变。真奇怪
有什么想法吗?如果你的用户滑块的框架是
CGRectMake(0, -120, 320, 155)
我怀疑您的userSlider是否可以接收发件人事件。因为如果UIControl的帧不在superView中,它可能不会接收发件人事件(外部部分)。你可以设置框架
CGRectMake(0, 0, 320, 155)
试一试。如果将viewDidLoad中的这4行代码移动到ViewView,会发生什么?什么都不会出现。不过,有趣的是,当视图没有作为子视图添加时,tableView可以很好地调整…它可以很好地处理事件,userSlider可以像我希望的那样随着我的点击移动。但是桌面视图不会移动,除非我在它被拉下后点击120和155之间…@HarlanHaskins你想让桌子只在点击120和155之间移动,对吗?让我进一步解释一下。视图从0到120(垂直)隐藏(相对于自身)。当你把它拉下来,它只是移动中心。它还应该调整tableView的大小和原点。