1

ハーランハスキンズは次のように書いています。

viewDidLoad にプログラムで追加された userSlider というビューがあります。

 self.userSlider = [[UserSliderView alloc] initWithFrame:CGRectMake(0, -120, 320, 155)];
     [self.userSlider setUser:user];
     [self.userSlider configureView];
     [self.view addSubview:self.userSlider];

そしてgameTableViewというテーブルビュー。

私はもともと 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];

    }];

}

 }

そうすれば、両方のビューが私が望むように移動します。

しかし、プログラムで追加すると、移動後に領域内をタップしない限り、突然 tableView が変更されません。本当に変です。

何か案は?

4

1 に答える 1

0

userSlider のフレームが

CGRectMake(0, -120, 320, 155)   

あなたのuserSliderがsenderイベントを受け取れるか疑問です.UIControlのフレームがsuperViewの外にあるとsenderイベント(外側の部分)を受け取れない可能性があるからです. フレームを設定できます

CGRectMake(0, 0, 320, 155)  

試してみる。

于 2013-01-23T06:21:47.350 に答える