UIScrollView的减速率可以修改吗?

Posted

技术标签:

【中文标题】UIScrollView的减速率可以修改吗?【英文标题】:Can UIScrollView's deceleration rate be modified? 【发布时间】:2009-02-04 21:18:25 【问题描述】:

由于最初提出这个问题,因此通过 OS 3.0 中引入的decelerationRate property 添加了 UIScrollView 减速率自定义。


我有一个 UIScrollView,我想改变它的减速率。为了清楚起见,我说的是当您在滚动视图上滑动手指并且在您抬起手指后视图继续滚动(但逐渐变慢)时。我想提高减速率,使其比默认情况下更快停止。

我看到一些应用程序的 UIScrollViews 似乎减速得更快。 UIScrollView 中似乎没有用于此的 API,但我想知道是否有其他方法可以做到这一点。

【问题讨论】:

该链接现在是:developer.apple.com/library/ios/documentation/UIKit/Reference/… 【参考方案1】:

您可以使用UIScrollView 的decelerationRate 属性来控制它。即使它是浮动的,它不接受除 UIScrollViewDecelerationRateNormal 或 UIScrollViewDecelerationRateFast 之外的任何值。看下面的代码

NSLog(@"1. decelerationRate %f", scrollview.decelerationRate);

scrollview.decelerationRate = UIScrollViewDecelerationRateNormal;
NSLog(@"2. decelerationRate %f", scrollview.decelerationRate);

scrollview.decelerationRate = UIScrollViewDecelerationRateFast;
NSLog(@"3. decelerationRate %f", scrollview.decelerationRate);

scrollview.decelerationRate = 0.7;
NSLog(@"4. decelerationRate %f", scrollview.decelerationRate);

scrollview.decelerationRate = 0.995;
NSLog(@"5. decelerationRate %f", scrollview.decelerationRate);

上面的代码给出了以下输出,很明显我们不能不使用自定义减速率。

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

【讨论】:

我发现了同样的行为 已确认。这一定是文档问题 不幸的是,这是真的。我希望在这两者之间至少有一个值,比如 0.994,但它不起作用。 很棒的收获。我插入了许多介于两者之间的值,并注意到它并没有什么不同。然后我尝试了 1.1 和 0.5,结果相同。您的代码 sn-p 执行相同的操作 @grzegorzdvipek 我碰巧在 Apple 的演示中看到了这样的一行。 float decel = UIScrollViewDecelerationRateNormal - (UIScrollViewDecelerationRateNormal - UIScrollViewDecelerationRateFast)/2.0; 我登录后发现它的值为 0.994000,正如你所愿。希望对您有所帮助。【参考方案2】:

是的,我已通过以下操作成功更改了减速率:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

【讨论】:

decelerationRate 实际上是一个float,所以你可以通过输入任意float值来进行更细致的控制。 @CharlieMezak 这是一个浮点数,但仅适用于 UIScrollViewDecelerationRateFast 和 UIScrollViewDecelerationRateNormal 值。【参考方案3】:

我发现通过使用 KVC 修改实例变量 _decelerationFactor,我可以将速率更改为 UIScrollViewDecelerationRateNormalUIScrollViewDecelerationRateFast 以外的值。我将UIScrollView 子类化,并将所有内容封装在一个try 块中

- (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;

【讨论】:

听起来是让您的应用被拒绝的快速方法。 我没有遇到任何问题,但它处于灰色地带。因为你可以直接在头文件中看到变量,不需要类转储。我觉得如果它可以改善用户体验但又不会让你的应用崩溃,那么它就属于它的范畴。 @mackross Soooo 这是 5 年前发布的,有人将这个解决方案放入应用商店吗?【参考方案4】:

有一个非常简单的方法。覆盖 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;

【讨论】:

这不起作用。滚动视图可能是直接访问私有成员变量而不是属性。【参考方案5】:

这是可能的,但您必须继承 UIScrollView 并覆盖所有触摸处理。这不是我选择的项目 - 需要大量的工作才能让它正确。

【讨论】:

以上是关于UIScrollView的减速率可以修改吗?的主要内容,如果未能解决你的问题,请参考以下文章

UI整理-----part4--UIScrollView

UI基础篇之UIScrollView

iOS开发UI篇—UIScrollView控件介绍

另一个减边距div内的减边距[重复]

如何使用主 iPhone 视图之外的 UI 元素在 Interface Builder 中设置 UIScrollView?

UIScrollview 是不是需要在视图上?