UIScrollView

//

//  SSRollingButtonScrollView.h

//  RollingScrollView

//

//  Created by ios on 15/4/27.

//  Copyright (c) 2015 ios. All rights reserved.

//


#import <UIKit/UIKit.h>


typedef enum {

    SShorizontalLayout,

    SSverticalLayout

} SScontentLayoutStyle;


@class SSRollingButtonScrollView;


@protocol SSRollingButtonScrollViewDelegate <NSObject>

@optional

- (void)rollingScrollViewButtonPushed:(UIButton *)button ssRollingButtonScrollView:(SSRollingButtonScrollView *)rollingButtonScrollView;

- (void)rollingScrollViewButtonIsInCenter:(UIButton *)button ssRollingButtonScrollView:(SSRollingButtonScrollView *)rollingButtonScrollView;


@optional

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset;

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;


@end


@interface SSRollingButtonScrollView : UIScrollView <UIScrollViewDelegate>


@property (nonatomic, weak) id <SSRollingButtonScrollViewDelegate> ssRollingButtonScrollViewDelegate;



@property (strong, nonatomic) UIFont *buttonNotCenterFont;

@property (strong, nonatomic) UIFont *buttonCenterFont;

@property (nonatomic) CGFloat fixedButtonWidth;

@property (nonatomic) CGFloat fixedButtonHeight;

@property (nonatomic) CGFloat spacingBetweenButtons;

@property (strong, nonatomic) UIColor *notCenterButtonTextColor;

@property (strong, nonatomic) UIColor *centerButtonTextColor;

@property (strong, nonatomic) UIColor *notCenterButtonBackgroundColor;

@property (strong, nonatomic) UIColor *centerButtonBackgroundColor;

@property (strong, nonatomic) UIImage *notCenterButtonBackgroundImage;

@property (strong, nonatomic) UIImage *centerButtonBackgroundImage;

@property (nonatomic) BOOL stopOnCenter;

@property (nonatomic) BOOL centerPushedButtons;

@property (nonatomic) BOOL playSound;


- (void)createButtonArrayWithButtonTitles:(NSArray *)titles andLayoutStyle:(SScontentLayoutStyle)layoutStyle;




@end


//

//  SSRollingButtonScrollView.m

//  RollingScrollView

//

//  Created by ios on 15/4/27.

//  Copyright (c) 2015 ios. All rights reserved.

//


#import "SSRollingButtonScrollView.h"

#import <AudioToolbox/AudioToolbox.h>


@implementation SSRollingButtonScrollView

{

    BOOL _viewsInitialLoad;

    BOOL _lockCenterButton;

    

    NSMutableArray *_rollingScrollViewButtonTitles;

    SScontentLayoutStyle _layoutStyle;

    

    NSMutableArray *_rollingScrollViewButtons;

    NSMutableArray *_visibleButtons;

    UIView *_buttonContainerView;

    

    NSInteger _rightMostVisibleButtonIndex;

    NSInteger _leftMostVisibleButtonIndex;

    

    NSInteger _topMostVisibleButtonIndex;

    NSInteger _bottomMostVisibleButtonIndex;

    

    NSInteger _scrollViewSelectedIndex;

    CGPoint _lastOffset;

    NSTimeInterval _lastTimeCapture;

    CGFloat _scrollVelocity;

    UIButton *_currentCenterButton;

    

    CGFloat _width;

    CGFloat _height;

}


- (id)initWithCoder:(NSCoder *)aDecoder

{

    if ((self = [super initWithCoder:aDecoder])) {

        

        _viewsInitialLoad = YES;

        _lockCenterButton = NO;

        

        self.contentSize = CGSizeMake(self.frame.size.width, self.frame.size.height);

        

        _rollingScrollViewButtonTitles = [NSMutableArray array];

        _rollingScrollViewButtons = [NSMutableArray array];

        _visibleButtons = [NSMutableArray array];

        _buttonContainerView = [[UIView alloc] init];

        _currentCenterButton = [[UIButton alloc] init];

        

        self.fixedButtonWidth = -1.0f;

        self.fixedButtonHeight = -1.0f;

        self.spacingBetweenButtons = 0.0f;

        //        self.notCenterButtonBackgroundColor = [UIColor clearColor];

        //        self.centerButtonBackgroundColor = [UIColor clearColor];

        self.notCenterButtonBackgroundImage = nil;

        self.centerButtonBackgroundImage = nil;

        self.buttonNotCenterFont = [UIFont systemFontOfSize:16];

        self.buttonCenterFont = [UIFont boldSystemFontOfSize:20];

        //        self.notCenterButtonTextColor = [UIColor grayColor];

        //        self.centerButtonTextColor = [UIColor orangeColor];

        self.stopOnCenter = YES;

        self.centerPushedButtons = YES;

        self.playSound = YES;

        

        [self setShowsHorizontalScrollIndicator:NO];

        [self setShowsVerticalScrollIndicator:NO];

        

        //

        _width = self.bounds.size.width;

        _height = self.bounds.size.height;

        

        self.delegate = self;

    }

    return self;

}


- (void)setContentSizeAndButtonContainerViewFrame

{

    if (_layoutStyle == SShorizontalLayout) {

        self.contentSize = CGSizeMake(5000, self.frame.size.height);

    } else {

        self.contentSize = CGSizeMake(self.frame.size.width, 5000);

    }

    

    _buttonContainerView.frame = CGRectMake(0, 0, self.contentSize.width, self.contentSize.height);

    [self addSubview:_buttonContainerView];

}

- (UIButton *)setBGColor:(UIColor *)color

{

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    

    UILabel *lable=[[UILabel alloc] initWithFrame:CGRectMake(button.frame.origin.x+14, button.frame.origin.y+10, 30, 20)];

    lable.backgroundColor=color;

    

    button.titleLabel.backgroundColor=color;

    [button addSubview:lable];

    

    

    //    [button setTitle:buttonTitle forState:UIControlStateNormal];

    //    button.titleLabel.font = self.buttonNotCenterFont;

    

    //    [button setTitleColor:self.notCenterButtonTextColor forState:UIControlStateNormal];

    //    [button setTitleColor:self.centerButtonTextColor forState:UIControlStateHighlighted];

    //    [button setBackgroundColor:self.notCenterButtonBackgroundColor];

    

    //    [button setBackgroundColor:color];

    

    //    if (self.notCenterButtonBackgroundImage != nil) {

    //        [button setBackgroundImage:self.notCenterButtonBackgroundImage forState:UIControlStateNormal];

    //    }

    

    return button;

}

- (UIButton *)createAndConfigureNewButton:(NSString *)buttonTitle

{

    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];

    

    [button setTitle:buttonTitle forState:UIControlStateNormal];

    button.titleLabel.font = self.buttonNotCenterFont;

    [button setTitleColor:self.notCenterButtonTextColor forState:UIControlStateNormal];

    [button setTitleColor:self.centerButtonTextColor forState:UIControlStateHighlighted];

    [button setBackgroundColor:self.notCenterButtonBackgroundColor];

    

    if (self.notCenterButtonBackgroundImage != nil) {

        [button setBackgroundImage:self.notCenterButtonBackgroundImage forState:UIControlStateNormal];

    }

    

    return button;

}


- (void)createButtonArrayWithButtonTitles:(NSArray *)titles andLayoutStyle:(SScontentLayoutStyle)layoutStyle

{

    _rollingScrollViewButtonTitles = [NSMutableArray arrayWithArray:titles];

    _layoutStyle = layoutStyle;

    

    [self setContentSizeAndButtonContainerViewFrame];

    

    CGFloat x = 0.0f;

    CGFloat y = 0.0f;

    CGFloat buttonWidth;

    CGFloat buttonHeight;

    _rollingScrollViewButtons = [NSMutableArray array];

    

    if (_layoutStyle == SShorizontalLayout) {

        

        while (x <= self.frame.size.width * 2) {

            

            

            for (UIColor *color in _rollingScrollViewButtonTitles) {

                

                NSLog(@"我的颜色 %@",color);

                //   UIButton *button = [self createAndConfigureNewButton:color];

                UIButton *button = [self setBGColor:color];

                //根据文本内容取得文本占用空间大小

                CGSize fittedButtonSize = [button.titleLabel.text sizeWithAttributes:@{NSFontAttributeName:self.buttonCenterFont}];

                

                if (self.fixedButtonWidth < 0) {

                    buttonWidth = ceilf(fittedButtonSize.width / 2) * 2;

                } else {

                    buttonWidth = self.fixedButtonWidth;

                }

                

                if (self.fixedButtonHeight < 0) {

                    buttonHeight = ceilf(fittedButtonSize.height / 2) * 2;

                } else {

                    buttonHeight = self.fixedButtonHeight;

                }

                x += buttonWidth + self.spacingBetweenButtons;

                

                button.frame = CGRectMake(x, y, buttonWidth, buttonHeight);

                

                

                //                [button addTarget:self action:@selector(scrollViewButtonPushed:) forControlEvents:UIControlEventTouchUpInside];

                

                [_rollingScrollViewButtons addObject:button];

            }

            

            //            for (NSString *buttonTitle in _rollingScrollViewButtonTitles) {

            //

            //                UIButton *button = [self createAndConfigureNewButton:buttonTitle];

            //

            //                CGSize fittedButtonSize = [button.titleLabel.text sizeWithAttributes:@{NSFontAttributeName:self.buttonCenterFont}];

            //

            //                if (self.fixedButtonWidth < 0) {

            //                    buttonWidth = ceilf(fittedButtonSize.width / 2) * 2;

            //                } else {

            //                    buttonWidth = self.fixedButtonWidth;

            //                }

            //

            //                if (self.fixedButtonHeight < 0) {

            //                    buttonHeight = ceilf(fittedButtonSize.height / 2) * 2;

            //                } else {

            //                    buttonHeight = self.fixedButtonHeight;

            //                }

            //

            //                button.frame = CGRectMake(x, y, buttonWidth, buttonHeight);

            //

            //                x += buttonWidth + self.spacingBetweenButtons;

            //

                            [button addTarget:self action:@selector(scrollViewButtonPushed:) forControlEvents:UIControlEventTouchUpInside];

            //

            //                [_rollingScrollViewButtons addObject:button];

            //            }

        }

        

    } else {

        

        while (y <= self.frame.size.height * 2) {

            

            for (NSString *buttonTitle in _rollingScrollViewButtonTitles) {

                

                UIButton *button = [self createAndConfigureNewButton:buttonTitle];

                

                CGSize fittedButtonSize = [button.titleLabel.text sizeWithAttributes:@{NSFontAttributeName:self.buttonCenterFont}];

                

                if (self.fixedButtonWidth < 0) {

                    buttonWidth = ceilf(fittedButtonSize.width / 2) * 2;

                } else {

                    buttonWidth = self.fixedButtonWidth;

                }

                

                if (self.fixedButtonHeight < 0) {

                    buttonHeight = ceilf(fittedButtonSize.height / 2) * 2;

                } else {

                    buttonHeight = self.fixedButtonHeight;

                }

                

                button.frame = CGRectMake(x, y, buttonWidth, buttonHeight);

                

                y += buttonHeight + self.spacingBetweenButtons;

                

                [button addTarget:self action:@selector(scrollViewButtonPushed:) forControlEvents:UIControlEventTouchUpInside];

                

                [_rollingScrollViewButtons addObject:button];

            }

        }

    }

    

    [self addSubview:_buttonContainerView];

    //    self.backgroundColor=[UIColor grayColor];

    

    //移动

    [self moveButtonToViewCenter:_currentCenterButton animated:YES];

}


- (void)layoutSubviews

{

    // If change in view size (typically due to device rotation), prevent center button from changing.

    if (_width != self.bounds.size.width || _height != self.bounds.size.height) {

        _width = self.bounds.size.width;

        _height = self.bounds.size.height;

        _lockCenterButton = YES;

    }

    

    [super layoutSubviews];

    

    if ([_rollingScrollViewButtonTitles count] > 0) {

        

        if (_lockCenterButton) {

            [self moveButtonToViewCenter:_currentCenterButton animated:NO];

            _lockCenterButton = NO;

        }

        

        [self recenterIfNecessary];

        [self tileContentInVisibleBounds];

        [self configureCenterButton:[self getCenterButton]];

        

        if (_viewsInitialLoad) {

            [self moveButtonToViewCenter:_currentCenterButton animated:NO];

            [self tileContentInVisibleBounds];

            _viewsInitialLoad = NO;

        }

    }

}


- (void)tileContentInVisibleBounds

{

    CGRect visibleBounds = [self convertRect:[self bounds] toView:_buttonContainerView];

    

    if (_layoutStyle == SShorizontalLayout) {

        

        CGFloat minimumVisibleX = CGRectGetMinX(visibleBounds);

        CGFloat maximumVisibleX = CGRectGetMaxX(visibleBounds);

        [self tileButtonsFromMinX:minimumVisibleX toMaxX:maximumVisibleX];

        

    } else {

        

        CGFloat minimumVisibleY = CGRectGetMinY(visibleBounds);

        CGFloat maximumVisibleY = CGRectGetMaxY(visibleBounds);

        [self tileButtonsFromMinY:minimumVisibleY toMaxY:maximumVisibleY];

    }

}


- (void)configureCenterButton:(UIButton *)centerButton

{

    if (centerButton != _currentCenterButton) {

        

        _currentCenterButton = centerButton;

        

        for (UIButton *button in _visibleButtons) {

            [button setBackgroundColor:self.notCenterButtonBackgroundColor];

            [button setBackgroundImage:self.notCenterButtonBackgroundImage forState:UIControlStateNormal];

            button.titleLabel.font = self.buttonNotCenterFont;

            [button setTitleColor:self.notCenterButtonTextColor forState:UIControlStateNormal];

        }

        [centerButton setBackgroundColor:self.centerButtonBackgroundColor];

        [centerButton setBackgroundImage:self.centerButtonBackgroundImage forState:UIControlStateNormal];

        centerButton.titleLabel.font = self.buttonCenterFont;

        centerButton.titleLabel.textColor = self.centerButtonTextColor;

        //        [centerButton setTitleColor:self.centerButtonTextColor forState:UIControlStateNormal];

        

        if (self.playSound) {

            AudioServicesPlaySystemSound(1105);

        }

    }

}


- (UIButton *)getCenterButton

{

    UIButton *centerButton = [[UIButton alloc] init];

    

    CGFloat buttonMinimumDistanceFromCenter = 5000.0f;

    CGFloat currentButtonDistanceFromCenter = 5000.0f;

    

    for (UIButton *button in _visibleButtons) {

        

        currentButtonDistanceFromCenter = fabs([self buttonDistanceFromCenter:button]);

        

        if (currentButtonDistanceFromCenter < buttonMinimumDistanceFromCenter) {

            buttonMinimumDistanceFromCenter = currentButtonDistanceFromCenter;

            centerButton = button;

        }

    }

    

    return centerButton;

}


- (CGFloat)buttonDistanceFromCenter:(UIButton *)button

{

    CGFloat distanceFromCenter;

    

    if (_layoutStyle == SShorizontalLayout) {

        

        CGFloat visibleContentCenterX = self.contentOffset.x + [self bounds].size.width / 2.0f;

        distanceFromCenter = visibleContentCenterX - button.center.x;

        

    } else {

        

        CGFloat visibleContentCenterY = self.contentOffset.y + [self bounds].size.height / 2.0f;

        distanceFromCenter = visibleContentCenterY - button.center.y;

    }

    

    return distanceFromCenter;

}


- (void)moveButtonToViewCenter:(UIButton *)button animated:(BOOL)animated

{

    if (_layoutStyle == SShorizontalLayout) {

        

        CGPoint currentOffset = self.contentOffset;

        CGFloat distanceFromCenter = [self buttonDistanceFromCenter:button];

        

        CGPoint targetOffset = CGPointMake(currentOffset.x - distanceFromCenter, 0.0f);

        

        [self setContentOffset:targetOffset animated:animated];

        

    } else {

        

        CGPoint currentOffset = self.contentOffset;

        CGFloat distanceFromCenter = [self buttonDistanceFromCenter:button];

        

        CGPoint targetOffset = CGPointMake(0.0f, currentOffset.y - distanceFromCenter);

        [self setContentOffset:targetOffset animated:animated];

    }

}


- (void)recenterIfNecessary

{

    if (_layoutStyle == SShorizontalLayout) {

        

        CGPoint currentOffset = [self contentOffset];

        CGFloat contentWidth = [self contentSize].width;

        CGFloat centerOffsetX = (contentWidth - [self bounds].size.width) / 2.0;

        CGFloat distanceFromCenter = fabs(currentOffset.x - centerOffsetX);

        

        if (distanceFromCenter > (contentWidth / 4.0))

        {

            self.contentOffset = CGPointMake(centerOffsetX, currentOffset.y);

            

            // move content by the same amount so it appears to stay still

            for (UIButton *button in _rollingScrollViewButtons) {

                CGPoint center = [_buttonContainerView convertPoint:button.center toView:self];

                center.x += (centerOffsetX - currentOffset.x);

                button.center = [self convertPoint:center toView:_buttonContainerView];

            }

        }

        

    } else {

        

        CGPoint currentOffset = [self contentOffset];

        CGFloat contentHeight = [self contentSize].height;

        CGFloat centerOffsetY = (contentHeight - [self bounds].size.height) / 2.0;

        CGFloat distanceFromCenter = fabs(currentOffset.y - centerOffsetY);

        

        if (distanceFromCenter > (contentHeight / 4.0))

        {

            self.contentOffset = CGPointMake(currentOffset.x, centerOffsetY);

            

            // move content by the same amount so it appears to stay still

            for (UIButton *button in _rollingScrollViewButtons) {

                CGPoint center = [_buttonContainerView convertPoint:button.center toView:self];

                center.y += (centerOffsetY - currentOffset.y);

                button.center = [self convertPoint:center toView:_buttonContainerView];

            }

        }

        

    }

}


- (void)scrollViewButtonIsInCenter:(UIButton *)sender

{

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(rollingScrollViewButtonIsInCenter:ssRollingButtonScrollView:)]) {

        [self.ssRollingButtonScrollViewDelegate rollingScrollViewButtonIsInCenter:sender ssRollingButtonScrollView:self];

    }

}


- (void)scrollViewButtonPushed:(UIButton *)sender

{

    if (_centerPushedButtons) {

        [self moveButtonToViewCenter:sender animated:YES];

        

    }

    

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(rollingScrollViewButtonPushed:ssRollingButtonScrollView:)]) {

        [self.ssRollingButtonScrollViewDelegate rollingScrollViewButtonPushed:sender ssRollingButtonScrollView:self];

    }

}


#pragma mark - Label Tiling


- (CGFloat)placeNewButtonOnRight:(CGFloat)rightEdge

{

    _rightMostVisibleButtonIndex++;

    if (_rightMostVisibleButtonIndex == [_rollingScrollViewButtons count]) {

        _rightMostVisibleButtonIndex = 0;

    }

    

    UIButton *button = _rollingScrollViewButtons[_rightMostVisibleButtonIndex];

    [_buttonContainerView addSubview:button];

    [_visibleButtons addObject:button]; // add rightmost label at the end of the array

    

    CGRect frame = [button frame];

    frame.origin.x = rightEdge;

    frame.origin.y = ([_buttonContainerView bounds].size.height - frame.size.height) / 2.0f;

    [button setFrame:frame];

    return CGRectGetMaxX(frame);

}


- (CGFloat)placeNewButtonOnLeft:(CGFloat)leftEdge

{

    _leftMostVisibleButtonIndex--;

    if (_leftMostVisibleButtonIndex < 0) {

        _leftMostVisibleButtonIndex = [_rollingScrollViewButtons count] - 1;

    }

    

    UIButton *button = _rollingScrollViewButtons[_leftMostVisibleButtonIndex];

    [_buttonContainerView addSubview:button];

    [_visibleButtons insertObject:button atIndex:0]; // add leftmost label at the beginning of the array

    

    CGRect frame = [button frame];

    frame.origin.x = leftEdge - frame.size.width;

    frame.origin.y = ([_buttonContainerView bounds].size.height - frame.size.height) / 2.0f;

    [button setFrame:frame];

    

    return CGRectGetMinX(frame);

}


- (void)tileButtonsFromMinX:(CGFloat)minimumVisibleX toMaxX:(CGFloat)maximumVisibleX

{

    // the upcoming tiling logic depends on there already being at least one label in the visibleLabels array, so

    // to kick off the tiling we need to make sure there's at least one label

    if ([_visibleButtons count] == 0)

    {

        _rightMostVisibleButtonIndex = -1;

        _leftMostVisibleButtonIndex = 0;

        [self placeNewButtonOnRight:minimumVisibleX];

    }

    

    // add labels that are missing on right side

    UIButton *lastButton = [_visibleButtons lastObject];

    CGFloat rightEdge = CGRectGetMaxX([lastButton frame]);

    

    while (rightEdge < maximumVisibleX)

    {

        rightEdge += self.spacingBetweenButtons;

        rightEdge = [self placeNewButtonOnRight:rightEdge];

    }

    

    // add labels that are missing on left side

    UIButton *firstButton = _visibleButtons[0];

    CGFloat leftEdge = CGRectGetMinX([firstButton frame]);

    while (leftEdge > minimumVisibleX)

    {

        leftEdge -= self.spacingBetweenButtons;

        leftEdge = [self placeNewButtonOnLeft:leftEdge];

    }

    

    // remove labels that have fallen off right edge

    lastButton = [_visibleButtons lastObject];

    while ([lastButton frame].origin.x > maximumVisibleX)

    {

        [lastButton removeFromSuperview];

        [_visibleButtons removeLastObject];

        lastButton = [_visibleButtons lastObject];

        

        _rightMostVisibleButtonIndex--;

        if (_rightMostVisibleButtonIndex < 0) {

            _rightMostVisibleButtonIndex = [_rollingScrollViewButtons count] - 1;

        }

    }

    

    // remove labels that have fallen off left edge

    firstButton = _visibleButtons[0];

    while (CGRectGetMaxX([firstButton frame]) < minimumVisibleX)

    {

        [firstButton removeFromSuperview];

        [_visibleButtons removeObjectAtIndex:0];

        firstButton = _visibleButtons[0];

        

        _leftMostVisibleButtonIndex++;

        if (_leftMostVisibleButtonIndex == [_rollingScrollViewButtons count]) {

            _leftMostVisibleButtonIndex = 0;

        }

    }

}


- (CGFloat)placeNewButtonOnBottom:(CGFloat)bottomEdge

{

    _bottomMostVisibleButtonIndex++;

    if (_bottomMostVisibleButtonIndex == [_rollingScrollViewButtons count]) {

        _bottomMostVisibleButtonIndex = 0;

    }

    

    UIButton *button = _rollingScrollViewButtons[_bottomMostVisibleButtonIndex];

    [_buttonContainerView addSubview:button];

    [_visibleButtons addObject:button]; // add bottommost label at the end of the array

    

    CGRect frame = [button frame];

    frame.origin.y = bottomEdge;

    frame.origin.x = ([_buttonContainerView bounds].size.width - frame.size.width) / 2.0f;

    [button setFrame:frame];

    return CGRectGetMaxY(frame);

}


- (CGFloat)placeNewButtonOnTop:(CGFloat)topEdge

{

    _topMostVisibleButtonIndex--;

    if (_topMostVisibleButtonIndex < 0) {

        _topMostVisibleButtonIndex = [_rollingScrollViewButtons count] - 1;

    }

    

    UIButton *button = _rollingScrollViewButtons[_topMostVisibleButtonIndex];

    [_buttonContainerView addSubview:button];

    [_visibleButtons insertObject:button atIndex:0]; // add leftmost label at the beginning of the array

    

    CGRect frame = [button frame];

    frame.origin.y = topEdge - frame.size.height;

    frame.origin.x = ([_buttonContainerView bounds].size.width - frame.size.width) / 2.0f;

    [button setFrame:frame];

    

    return CGRectGetMinY(frame);

}


- (void)tileButtonsFromMinY:(CGFloat)minimumVisibleY toMaxY:(CGFloat)maximumVisibleY

{

    // the upcoming tiling logic depends on there already being at least one label in the visibleLabels array, so

    // to kick off the tiling we need to make sure there's at least one label

    if ([_visibleButtons count] == 0)

    {

        _bottomMostVisibleButtonIndex = -1;

        _topMostVisibleButtonIndex = 0;

        [self placeNewButtonOnBottom:minimumVisibleY];

    }

    

    // add labels that are missing on right side

    UIButton *lastButton = [_visibleButtons lastObject];

    CGFloat bottomEdge = CGRectGetMaxY([lastButton frame]);

    

    while (bottomEdge < maximumVisibleY)

    {

        bottomEdge += self.spacingBetweenButtons;

        bottomEdge = [self placeNewButtonOnBottom:bottomEdge];

    }

    

    // add labels that are missing on left side

    UIButton *firstButton = _visibleButtons[0];

    CGFloat topEdge = CGRectGetMinY([firstButton frame]);

    while (topEdge > minimumVisibleY)

    {

        topEdge -= self.spacingBetweenButtons;

        topEdge = [self placeNewButtonOnTop:topEdge];

    }

    

    // remove labels that have fallen off right edge

    lastButton = [_visibleButtons lastObject];

    while ([lastButton frame].origin.y > maximumVisibleY)

    {

        [lastButton removeFromSuperview];

        [_visibleButtons removeLastObject];

        lastButton = [_visibleButtons lastObject];

        

        _bottomMostVisibleButtonIndex--;

        if (_bottomMostVisibleButtonIndex < 0) {

            _bottomMostVisibleButtonIndex = [_rollingScrollViewButtons count] - 1;

        }

    }

    

    // remove labels that have fallen off left edge

    firstButton = _visibleButtons[0];

    while (CGRectGetMaxY([firstButton frame]) < minimumVisibleY)

    {

        [firstButton removeFromSuperview];

        [_visibleButtons removeObjectAtIndex:0];

        firstButton = _visibleButtons[0];

        

        _topMostVisibleButtonIndex++;

        if (_topMostVisibleButtonIndex == [_rollingScrollViewButtons count]) {

            _topMostVisibleButtonIndex = 0;

        }

    }

}


#pragma mark - UIScrollViewDelegate


- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    if (self.stopOnCenter) {

        

        if (_layoutStyle == SShorizontalLayout) {

            

            CGPoint currentOffset = self.contentOffset;

            NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];

            NSTimeInterval timeChange = currentTime - _lastTimeCapture;

            CGFloat distanceChange = currentOffset.x - _lastOffset.x;

            _scrollVelocity = distanceChange / timeChange;

            

            if (scrollView.decelerating) {

                if (fabsf(_scrollVelocity) < 150) {

                    [self moveButtonToViewCenter:_currentCenterButton animated:YES];

                }

            }

            _lastOffset = currentOffset;

            _lastTimeCapture = currentTime;

            

        } else {

            

            CGPoint currentOffset = self.contentOffset;

            NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];

            NSTimeInterval timeChange = currentTime - _lastTimeCapture;

            CGFloat distanceChange = currentOffset.y - _lastOffset.y;

            _scrollVelocity = distanceChange / timeChange;

            

            if (scrollView.decelerating) {

                if (fabsf(_scrollVelocity) < 75) {

                    [self moveButtonToViewCenter:_currentCenterButton animated:YES];

                }

            }

            _lastOffset = currentOffset;

            _lastTimeCapture = currentTime;

        }

    }

    

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(scrollViewDidScroll:)]) {

        [self.ssRollingButtonScrollViewDelegate scrollViewDidScroll:scrollView];

    }

}


- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(scrollViewWillBeginDragging:)]) {

        [self.ssRollingButtonScrollViewDelegate scrollViewWillBeginDragging:scrollView];

    }

}


- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

{

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(scrollViewWillEndDragging:withVelocity:targetContentOffset:)]) {

        [self.ssRollingButtonScrollViewDelegate scrollViewWillEndDragging:scrollView withVelocity:velocity targetContentOffset:targetContentOffset];

    }

}


- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

{

    if (self.stopOnCenter) {

        if (!decelerate) {

            [self moveButtonToViewCenter:_currentCenterButton animated:YES];

            [self scrollViewButtonIsInCenter:[self getCenterButton]];

        }

    }

    

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(scrollViewDidEndDragging:willDecelerate:)]) {

        [self.ssRollingButtonScrollViewDelegate scrollViewDidEndDragging:scrollView willDecelerate:decelerate];

    }

}


- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView

{

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(scrollViewWillBeginDecelerating:)]) {

        [self.ssRollingButtonScrollViewDelegate scrollViewWillBeginDecelerating:scrollView];

    }

}


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

{

    [self scrollViewButtonIsInCenter:[self getCenterButton]];

    

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(scrollViewDidEndDecelerating:)]) {

        [self.ssRollingButtonScrollViewDelegate scrollViewDidEndDecelerating:scrollView];

    }

}


- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

{

    if ([self.ssRollingButtonScrollViewDelegate respondsToSelector:@selector(scrollViewDidEndScrollingAnimation:)]) {

        [self.ssRollingButtonScrollViewDelegate scrollViewDidEndScrollingAnimation:scrollView];

    }

}


@end




        NSArray *digits = [NSArray arrayWithObjects:@"10", @"12", @"14", @"16", @"18", @"20", @"24", @"28",@"32",nil];

        

        self.fontsizeView.fixedButtonWidth = 60.0f;

        self.fontsizeView.fixedButtonHeight = 40.0f;

        self.fontsizeView.spacingBetweenButtons = 2.0f;

        self.fontsizeView.notCenterButtonBackgroundColor = [UIColor whiteColor];

        [self.fontsizeView createButtonArrayWithButtonTitles:digits andLayoutStyle:LLhorizontalLayout];

        self.fontsizeView.llRollingButtonScrollViewDelegate = self;




#pragma mark - LLRollingButtonScrollViewDelegate


- (void)rollingScrollViewButtonPushed:(UIButton *)button llRollingButtonScrollView:(LLRollingButtonScrollView *)rollingButtonScrollView

{

    NSLog(@"pushed: %@", button.titleLabel.text);

    

}


- (void)rollingScrollViewButtonIsInCenter:(UIButton *)button llRollingButtonScrollView:(LLRollingButtonScrollView *)rollingButtonScrollView

{

    

    NSString *jieStr=button.titleLabel.text;

    

    NSLog(@"文字%@",jieStr);

    

    

    if (rollingButtonScrollView==_fontsizeView) {

        _fontText.font=[UIFont systemFontOfSize:[jieStr floatValue]];

        

    }

    

}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值