【问题标题】:scrollViewDidEndDecelerating not executingscrollViewDidEndDecelerating 未执行
【发布时间】:2012-06-14 12:05:05
【问题描述】:

我似乎无法调用 scrollViewDidEndDecelerating。 我有一个滚动视图,里面有 2 个视图。现在,当滚动视图完成滚动到第二个视图时,我需要它为第一个视图中的标签设置一个值。

头文件:

@interface ViewController: UIViewController
{
   UIScrollView *scrollView;
   UIView *view1;
   UIView *view2;
}

@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) IBOutlet UIView *view1;
@property (strong, nonatomic) IBOutlet UIView *view2;
@property (weak, nonatomic) IBOutlet UILabel *lbl;

实施文件:

@synthesize scrollView, view1, view2;

-(void)viewDidLoad
{
   self.view1=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
   self.view2=[[UIView alloc] initWithFrame:CGRectMake(320, 0, 320, 480)];

   [self.scrollView addSubView:self.view1];
   [self.scrollView addSubView:self.view2];

   self.scrollView.bounces=NO;
   self.scrollView.contentSize=CGSizeMake(640,460);
   [self.scrollView setShowHorizontalScrollIndicator:NO];
   [self.scrollView scrollRectToVisible:CGRectMake(0, 0, 320, 416) animated:NO];
}

-(void)scrollViewDidEndDecelerating:(UIView *)scrollView
{
   lbl.text=@"0";
}

我没有发现任何问题,它应该可以正常工作。有人可以帮我吗?会很感激的。

【问题讨论】:

  • 你设置了滚动视图代理吗?
  • 看起来他没有。
  • 嗯,不,我没有在委托文件中添加任何内容。我将如何设置它?谢谢:)
  • 为了让事情变得更有趣:唯一被带动画的编程滚动调用的委托方法是-scrollViewDidScroll:,并且只有在滚动发生时。

标签: iphone xcode xcode4


【解决方案1】:

scrollViewDidEndDecelerating 如果用户滚动缓慢(即滚动视图不会继续滚动),则不会调用。在这种情况下,委托调用 scrollViewDidEndDragging。所以当用户停止滚动并且滚动视图停止时做一些事情,你可以将它们结合起来:

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
  if !decelerate {
     endOfScroll()
  }
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
  endOfScroll()
}

func endOfScroll() {
  //The user finished scrolling
}

在 Objective-C 中

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
   if(!decelerate) [self endOfScroll];
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
  [self endOfScroll];
}

-(void)endOfScroll{
  //Do something
}

【讨论】:

  • 所以滚动视图可以在不减速的情况下结束。这就是存在“减速”参数的原因!
【解决方案2】:

要么将滚动视图的委托属性连接到 Interface Builder 中的文件所有者对象,要么只是在 ViewController 的 ViewDidLoad 中手动设置委托。

scrollview.delegate = self

【讨论】:

    【解决方案3】:

    这样可以:

    头文件:

    @interface ViewController: UIViewController <UIScrollViewDelegate> //promise that you'll act as scrollView's delegate
    {
       UIScrollView *scrollView;
       UIView *view1;
       UIView *view2;
    }
    
    @property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
    @property (strong, nonatomic) IBOutlet UIView *view1;
    @property (strong, nonatomic) IBOutlet UIView *view2;
    @property (weak, nonatomic) IBOutlet UILabel *lbl;
    

    实施文件:

    @synthesize scrollView, view1, view2;
    
    -(void)viewDidLoad
    {
       self.view1=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
       self.view2=[[UIView alloc] initWithFrame:CGRectMake(320, 0, 320, 480)];
    
       [self.scrollView addSubView:self.view1];
       [self.scrollView addSubView:self.view2];
    
       self.scrollView.bounces=NO;
       self.scrollView.contentSize=CGSizeMake(640,460);
       [self.scrollView setShowHorizontalScrollIndicator:NO];
       [self.scrollView scrollRectToVisible:CGRectMake(0, 0, 320, 416) animated:NO];
       [self.scrollView setDelegate:self];//Set delegate
    }
    
    -(void)scrollViewDidEndDecelerating:(UIView *)scrollView
    {
       lbl.text=@"0";
    }
    

    【讨论】:

    • 嘿最后一件事,我如何检查 view2 的 x 位置?
    • 你可以通过它的 frame 属性访问它: int x-pos=view2.frame.origin.x;我猜它会起作用,这就是你想要的,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2013-01-10
    • 2021-01-24
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多