2009-02-04 106 views
20

由于最初提出这个问题,所以通过OS 3.0中引入的decelerationRate property添加了UIScrollView减速率自定义。可以修改UIScrollView的减速率吗?


我有一个UIScrollView,其减速度,我想改变。为了清楚起见,我说的是当你在滚动视图上滑动你的手指并且在你抬起你的手指后视图继续滚动(但是逐渐减慢)。我想增加减速率,以便它在默认情况下尽快停止。

我见过一些应用程序,其中UIScrollViews似乎更快地减速。在UIScrollView中似乎没有这个API,但我想知道是否有另一种方法来做到这一点。

+0

该链接现在是:http://developer.apple.com/library/ios/documentation/UIKit/Reference/ UIScrollView_Class/Reference/UIScrollView.html#// apple_ref/doc/uid/TP40006922-CH3-DontLinkElementID_2 – 2011-02-10 02:09:55

+0

固定 - 谢谢。 – 2011-02-10 04:45:40

回答

0

这是可能的,但你必须继承UIScrollView并覆盖所有的触摸处理。这不是我的选择项目 - 要做对的工作需要很多工作。

29

是的,我已经成功地通过执行以下操作改变了减速率:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

decelerationRate实际上是一个浮点数,所以你可以通过输入任何浮点数来进行更详细的控制。 – CharlieMezak 2011-01-14 21:07:40

+0

工作过,谢谢! – Nippysaurus 2011-06-06 12:37:25

45

您可以使用UIScrollViewdecelerationRate属性来控制它。尽管它的浮点数,它不接受除UIScrollViewDecelerationRateNormal或UIScrollViewDecelerationRateFast以外的任何值。看看下面的代码

​​

上面的代码给出了以下输出,它非常清晰,我们不能使用自定义减速率。

2012-01-03 11:59:41.164 testviewv2[10023:707] 1. decelerationRate 0.998000 
2012-01-03 11:59:41.172 testviewv2[10023:707] 2. decelerationRate 0.998000 
2012-01-03 11:59:41.173 testviewv2[10023:707] 3. decelerationRate 0.990000 
2012-01-03 11:59:41.175 testviewv2[10023:707] 4. decelerationRate 0.990000 
2012-01-03 11:59:41.176 testviewv2[10023:707] 5. decelerationRate 0.998000 
12

我发现,通过使用KVC修改实例变量_decelerationFactor让我改变率比UIScrollViewDecelerationRateNormalUIScrollViewDecelerationRateFast其他的东西。我分类UIScrollView,并在试块中包裹全部

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     @try { 
      CGFloat decelerationRate = UIScrollViewDecelerationRateFast +(UIScrollViewDecelerationRateNormal - UIScrollViewDecelerationRateFast) * .52; 
      [self setValue:[NSValue valueWithCGSize:CGSizeMake(decelerationRate,decelerationRate)] forKey:@"_decelerationFactor"]; 

     } 
     @catch (NSException *exception) { 
      // if they modify the way it works under us. 
     } 


    } 
    return self; 
} 
1

有一个非常简单的方法。重写setter方法。

@interface UIArbitraryDeceleratingScrollView : UIScrollView 

@property(nonatomic,assign) CGFloat decelerationRate; 

@end 

@implementation UIArbitraryDeceleratingScrollView 

@synthesize decelerationRate = _decelerationRate; 

- (void)setDecelerationRate:(CGFloat)dr 
{ 
    [super setDecelerationRate:dr]; 
    _decelerationRate = dr; 
} 

@end 

现在,将你想要什么,像这样的例子:

_scroller.decelerationRate = (UIScrollViewDecelerationRateNormal+UIScrollViewDecelerationRateFast)/2.1;