// // 如遇到问题或有更好方案,请通过以下方式进行联系 // QQ群:429899752 // Email:kingsic@126.com // GitHub:https://github.com/kingsic/SGPagingView // // SGPageTitleView.m // SGPagingViewExample // // Created by kingsic on 17/4/10. // Copyright © 2017年 kingsic. All rights reserved. // #import "SGPageTitleView.h" #import "UIView+SGPagingView.h" #import "SGPageTitleViewConfigure.h" #define SGPageTitleViewWidth self.frame.size.width #define SGPageTitleViewHeight self.frame.size.height #pragma mark - - - SGPageTitleButton @interface SGPageTitleButton : UIButton @end @implementation SGPageTitleButton - (void)setHighlighted:(BOOL)highlighted { } @end #pragma mark - - - SGPageTitleView @interface SGPageTitleView () /// SGPageTitleViewDelegate @property (nonatomic, weak) id delegatePageTitleView; /// SGPageTitleView 配置信息 @property (nonatomic, readwrite, strong) SGPageTitleViewConfigure *configure; /// scrollView @property (nonatomic, strong) UIScrollView *scrollView; /// 指示器 @property (nonatomic, strong) UIView *indicatorView; /// 底部分割线 @property (nonatomic, strong) UIView *bottomSeparator; /// 保存外界传递过来的标题数组 @property (nonatomic, strong) NSArray *titleArr; /// 存储标题按钮的数组 @property (nonatomic, strong) NSMutableArray *btnMArr; /// tempBtn @property (nonatomic, strong) UIButton *tempBtn; /// 记录所有按钮文字宽度 @property (nonatomic, assign) CGFloat allBtnTextWidth; /// 记录所有子控件的宽度 @property (nonatomic, assign) CGFloat allBtnWidth; /// 标记按钮下标 @property (nonatomic, assign) NSInteger signBtnIndex; /// 开始颜色, 取值范围 0~1 @property (nonatomic, assign) CGFloat startR; @property (nonatomic, assign) CGFloat startG; @property (nonatomic, assign) CGFloat startB; /// 完成颜色, 取值范围 0~1 @property (nonatomic, assign) CGFloat endR; @property (nonatomic, assign) CGFloat endG; @property (nonatomic, assign) CGFloat endB; @end @implementation SGPageTitleView - (instancetype)initWithFrame:(CGRect)frame delegate:(id)delegate titleNames:(NSArray *)titleNames configure:(SGPageTitleViewConfigure *)configure { if (self = [super initWithFrame:frame]) { self.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.77]; if (delegate == nil) { @throw [NSException exceptionWithName:@"SGPagingView" reason:@"SGPageTitleView 的代理方法必须设置" userInfo:nil]; } self.delegatePageTitleView = delegate; if (titleNames == nil) { @throw [NSException exceptionWithName:@"SGPagingView" reason:@"SGPageTitleView 的标题数组必须设置" userInfo:nil]; } self.titleArr = titleNames; if (configure == nil) { @throw [NSException exceptionWithName:@"SGPagingView" reason:@"SGPageTitleView 的配置属性必须设置" userInfo:nil]; } self.configure = configure; [self initialization]; [self setupSubviews]; } return self; } + (instancetype)pageTitleViewWithFrame:(CGRect)frame delegate:(id)delegate titleNames:(NSArray *)titleNames configure:(SGPageTitleViewConfigure *)configure { return [[self alloc] initWithFrame:frame delegate:delegate titleNames:titleNames configure:configure]; } - (void)initialization { _isTitleGradientEffect = YES; _isOpenTitleTextZoom = NO; _isShowIndicator = YES; _isNeedBounces = YES; _isShowBottomSeparator = YES; _selectedIndex = 0; _titleTextScaling = 0.1; } - (void)setupSubviews { // 0、处理偏移量 UIView *tempView = [[UIView alloc] initWithFrame:CGRectZero]; [self addSubview:tempView]; // 1、添加 UIScrollView [self addSubview:self.scrollView]; // 2、添加标题按钮 [self setupTitleButtons]; // 3、添加底部分割线 [self addSubview:self.bottomSeparator]; // 4、添加指示器 [self.scrollView insertSubview:self.indicatorView atIndex:0]; } #pragma mark - - - layoutSubviews - (void)layoutSubviews { [super layoutSubviews]; // 选中按钮下标初始值 UIButton *lastBtn = self.btnMArr.lastObject; if (lastBtn.tag >= _selectedIndex && _selectedIndex >= 0) { [self P_btn_action:self.btnMArr[_selectedIndex]]; } else { return; } } #pragma mark - - - 懒加载 - (NSArray *)titleArr { if (!_titleArr) { _titleArr = [NSArray array]; } return _titleArr; } - (NSMutableArray *)btnMArr { if (!_btnMArr) { _btnMArr = [NSMutableArray array]; } return _btnMArr; } - (UIScrollView *)scrollView { if (!_scrollView) { _scrollView = [[UIScrollView alloc] init]; _scrollView.showsVerticalScrollIndicator = NO; _scrollView.showsHorizontalScrollIndicator = NO; _scrollView.alwaysBounceHorizontal = YES; _scrollView.frame = CGRectMake(0, 0, SGPageTitleViewWidth, SGPageTitleViewHeight); } return _scrollView; } - (UIView *)indicatorView { if (!_indicatorView) { _indicatorView = [[UIView alloc] init]; if (self.configure.indicatorStyle == SGIndicatorStyleCover) { CGFloat tempIndicatorViewH = [self SG_heightWithString:[self.btnMArr[0] currentTitle] font:self.configure.titleFont]; if (self.configure.indicatorHeight > self.SG_height) { _indicatorView.SG_y = 0; _indicatorView.SG_height = self.SG_height; } else if (self.configure.indicatorHeight < tempIndicatorViewH) { _indicatorView.SG_y = 0.5 * (self.SG_height - tempIndicatorViewH); _indicatorView.SG_height = tempIndicatorViewH; } else { _indicatorView.SG_y = 0.5 * (self.SG_height - self.configure.indicatorHeight); _indicatorView.SG_height = self.configure.indicatorHeight; } // 圆角处理 if (self.configure.indicatorCornerRadius > 0.5 * _indicatorView.SG_height) { _indicatorView.layer.cornerRadius = 0.5 * _indicatorView.SG_height; } else { _indicatorView.layer.cornerRadius = self.configure.indicatorCornerRadius; } // 边框宽度及边框颜色 _indicatorView.layer.borderWidth = self.configure.indicatorBorderWidth; _indicatorView.layer.borderColor = self.configure.indicatorBorderColor.CGColor; } else { CGFloat indicatorViewH = self.configure.indicatorHeight; _indicatorView.SG_height = indicatorViewH; _indicatorView.SG_y = self.SG_height - indicatorViewH; } _indicatorView.backgroundColor = self.configure.indicatorColor; } return _indicatorView; } - (UIView *)bottomSeparator { if (!_bottomSeparator) { _bottomSeparator = [[UIView alloc] init]; CGFloat bottomSeparatorW = self.SG_width; CGFloat bottomSeparatorH = 0.5; CGFloat bottomSeparatorX = 0; CGFloat bottomSeparatorY = self.SG_height - bottomSeparatorH; _bottomSeparator.frame = CGRectMake(bottomSeparatorX, bottomSeparatorY, bottomSeparatorW, bottomSeparatorH); _bottomSeparator.backgroundColor = [UIColor lightGrayColor]; } return _bottomSeparator; } #pragma mark - - - 计算字符串宽度 - (CGFloat)SG_widthWithString:(NSString *)string font:(UIFont *)font { NSDictionary *attrs = @{NSFontAttributeName : font}; return [string boundingRectWithSize:CGSizeMake(0, 0) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size.width; } #pragma mark - - - 计算字符串高度 - (CGFloat)SG_heightWithString:(NSString *)string font:(UIFont *)font { NSDictionary *attrs = @{NSFontAttributeName : font}; return [string boundingRectWithSize:CGSizeMake(0, 0) options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size.height; } #pragma mark - - - 添加标题按钮 - (void)setupTitleButtons { // 计算所有按钮的文字宽度 [self.titleArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { CGFloat tempWidth = [self SG_widthWithString:obj font:self.configure.titleFont]; self.allBtnTextWidth += tempWidth; }]; // 所有按钮文字宽度 + 按钮之间的间隔 self.allBtnWidth = self.configure.spacingBetweenButtons * (self.titleArr.count + 1) + self.allBtnTextWidth; self.allBtnWidth = ceilf(self.allBtnWidth); NSInteger titleCount = self.titleArr.count; if (self.allBtnWidth <= self.bounds.size.width) { // SGPageTitleView 静止样式 CGFloat btnY = 0; CGFloat btnW = SGPageTitleViewWidth / self.titleArr.count; CGFloat btnH = 0; if (self.configure.indicatorStyle == SGIndicatorStyleDefault) { btnH = SGPageTitleViewHeight - self.configure.indicatorHeight; } else { btnH = SGPageTitleViewHeight; } for (NSInteger index = 0; index < titleCount; index++) { SGPageTitleButton *btn = [[SGPageTitleButton alloc] init]; CGFloat btnX = btnW * index; btn.frame = CGRectMake(btnX, btnY, btnW, btnH); btn.tag = index; btn.titleLabel.font = self.configure.titleFont; [btn setTitle:self.titleArr[index] forState:(UIControlStateNormal)]; [btn setTitleColor:self.configure.titleColor forState:(UIControlStateNormal)]; [btn setTitleColor:self.configure.titleSelectedColor forState:(UIControlStateSelected)]; [btn addTarget:self action:@selector(P_btn_action:) forControlEvents:(UIControlEventTouchUpInside)]; [self.btnMArr addObject:btn]; [self.scrollView addSubview:btn]; [self setupStartColor:self.configure.titleColor]; [self setupEndColor:self.configure.titleSelectedColor]; } self.scrollView.contentSize = CGSizeMake(SGPageTitleViewWidth, SGPageTitleViewHeight); } else { // SGPageTitleView 滚动样式 CGFloat btnX = 0; CGFloat btnY = 0; CGFloat btnH = 0; if (self.configure.indicatorStyle == SGIndicatorStyleDefault) { btnH = SGPageTitleViewHeight - self.configure.indicatorHeight; } else { btnH = SGPageTitleViewHeight; } for (NSInteger index = 0; index < titleCount; index++) { SGPageTitleButton *btn = [[SGPageTitleButton alloc] init]; CGFloat btnW = [self SG_widthWithString:self.titleArr[index] font:self.configure.titleFont] + self.configure.spacingBetweenButtons; btn.frame = CGRectMake(btnX, btnY, btnW, btnH); btnX = btnX + btnW; btn.tag = index; btn.titleLabel.font = self.configure.titleFont; [btn setTitle:self.titleArr[index] forState:(UIControlStateNormal)]; [btn setTitleColor:self.configure.titleColor forState:(UIControlStateNormal)]; [btn setTitleColor:self.configure.titleSelectedColor forState:(UIControlStateSelected)]; [btn addTarget:self action:@selector(P_btn_action:) forControlEvents:(UIControlEventTouchUpInside)]; [self.btnMArr addObject:btn]; [self.scrollView addSubview:btn]; [self setupStartColor:self.configure.titleColor]; [self setupEndColor:self.configure.titleSelectedColor]; } CGFloat scrollViewWidth = CGRectGetMaxX(self.scrollView.subviews.lastObject.frame); self.scrollView.contentSize = CGSizeMake(scrollViewWidth, SGPageTitleViewHeight); } } #pragma mark - - - 标题按钮的点击事件 - (void)P_btn_action:(UIButton *)button { // 1、改变按钮的选择状态 [self P_changeSelectedButton:button]; // 2、滚动标题选中按钮居中 if (self.allBtnWidth > SGPageTitleViewWidth) { [self P_selectedBtnCenter:button]; } // 3、改变指示器的位置以及指示器宽度样式 [self P_changeIndicatorViewLocationWithButton:button]; // 4、pageTitleViewDelegate if ([self.delegatePageTitleView respondsToSelector:@selector(pageTitleView:selectedIndex:)]) { [self.delegatePageTitleView pageTitleView:self selectedIndex:button.tag]; } // 5、标记按钮下标 self.signBtnIndex = button.tag; } - (void)c_btn_action:(UIButton *)button { // 1、改变按钮的选择状态 [self P_changeSelectedButton:button]; // 2、滚动标题选中按钮居中 if (self.allBtnWidth > SGPageTitleViewWidth) { [self P_selectedBtnCenter:button]; } // 3、改变指示器的位置以及指示器宽度样式 [self P_changeIndicatorViewLocationWithButton:button]; // 4、pageTitleViewDelegate // 5、标记按钮下标 self.signBtnIndex = button.tag; } #pragma mark - - - 改变按钮的选择状态 - (void)P_changeSelectedButton:(UIButton *)button { if (self.tempBtn == nil) { button.selected = YES; self.tempBtn = button; } else if (self.tempBtn != nil && self.tempBtn == button){ button.selected = YES; } else if (self.tempBtn != button && self.tempBtn != nil){ self.tempBtn.selected = NO; button.selected = YES; self.tempBtn = button; } // 标题文字缩放属性 if (self.isOpenTitleTextZoom) { [self.btnMArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { UIButton *btn = obj; btn.transform = CGAffineTransformMakeScale(1, 1); }]; button.transform = CGAffineTransformMakeScale(1 + self.titleTextScaling, 1 + self.titleTextScaling); } } #pragma mark - - - 滚动标题选中按钮居中 - (void)P_selectedBtnCenter:(UIButton *)centerBtn { // 计算偏移量 CGFloat offsetX = centerBtn.center.x - SGPageTitleViewWidth * 0.5; if (offsetX < 0) offsetX = 0; // 获取最大滚动范围 CGFloat maxOffsetX = self.scrollView.contentSize.width - SGPageTitleViewWidth; if (offsetX > maxOffsetX) offsetX = maxOffsetX; // 滚动标题滚动条 [self.scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES]; } #pragma mark - - - 改变指示器的位置以及指示器宽度样式 - (void)P_changeIndicatorViewLocationWithButton:(UIButton *)button { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (self.configure.indicatorStyle == SGIndicatorStyleFixed) { self.indicatorView.SG_width = self.configure.indicatorFixedWidth; self.indicatorView.SG_centerX = button.SG_centerX; } else if (self.configure.indicatorStyle == SGIndicatorStyleDynamic) { self.indicatorView.SG_width = self.configure.indicatorDynamicWidth; self.indicatorView.SG_centerX = button.SG_centerX; } else { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:button.currentTitle font:self.configure.titleFont]; if (tempIndicatorWidth > button.SG_width) { tempIndicatorWidth = button.SG_width; } self.indicatorView.SG_width = tempIndicatorWidth; self.indicatorView.SG_centerX = button.SG_centerX; } }]; } #pragma mark - - - 给外界提供的方法 - (void)setPageTitleViewWithProgress:(CGFloat)progress originalIndex:(NSInteger)originalIndex targetIndex:(NSInteger)targetIndex { // 1、取出 originalBtn/targetBtn UIButton *originalBtn = self.btnMArr[originalIndex]; UIButton *targetBtn = self.btnMArr[targetIndex]; self.signBtnIndex = targetBtn.tag; // 2、 滚动标题选中居中 [self P_selectedBtnCenter:targetBtn]; // 3、处理指示器的逻辑 if (self.allBtnWidth <= self.bounds.size.width) { /// SGPageTitleView 不可滚动 if (self.configure.indicatorScrollStyle == SGIndicatorScrollStyleDefault) { [self P_smallIndicatorScrollStyleDefaultWithProgress:progress originalBtn:originalBtn targetBtn:targetBtn]; } else { [self P_smallIndicatorScrollStyleHalfEndWithProgress:progress originalBtn:originalBtn targetBtn:targetBtn]; } } else { /// SGPageTitleView 可滚动 if (self.configure.indicatorScrollStyle == SGIndicatorScrollStyleDefault) { [self P_indicatorScrollStyleDefaultWithProgress:progress originalBtn:originalBtn targetBtn:targetBtn]; } else { [self P_indicatorScrollStyleHalfEndWithProgress:progress originalBtn:originalBtn targetBtn:targetBtn]; } } // 4、颜色的渐变(复杂) if (self.isTitleGradientEffect) { [self P_isTitleGradientEffectWithProgress:progress originalBtn:originalBtn targetBtn:targetBtn]; } // 5 、标题文字缩放属性 if (self.isOpenTitleTextZoom) { // 左边缩放 originalBtn.transform = CGAffineTransformMakeScale((1 - progress) * self.titleTextScaling + 1, (1 - progress) * self.titleTextScaling + 1); // 右边缩放 targetBtn.transform = CGAffineTransformMakeScale(progress * self.titleTextScaling + 1, progress * self.titleTextScaling + 1); } } /** * 根据下标重置标题文字 * * @param index 标题所对应的下标 * @param title 新标题名 */ - (void)resetTitleWithIndex:(NSInteger)index newTitle:(NSString *)title { if (index < self.btnMArr.count) { UIButton *button = (UIButton *)self.btnMArr[index]; [button setTitle:title forState:UIControlStateNormal]; if (self.signBtnIndex == index) { if (self.configure.indicatorStyle == SGIndicatorStyleDefault || self.configure.indicatorStyle == SGIndicatorStyleCover) { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:button.currentTitle font:self.configure.titleFont]; if (tempIndicatorWidth > button.SG_width) { tempIndicatorWidth = button.SG_width; } self.indicatorView.SG_width = tempIndicatorWidth; self.indicatorView.SG_centerX = button.SG_centerX; } } } } #pragma mark - - - SGPageTitleView 静止样式下指示器默认滚动样式(SGIndicatorScrollStyleDefault) - (void)P_smallIndicatorScrollStyleDefaultWithProgress:(CGFloat)progress originalBtn:(UIButton *)originalBtn targetBtn:(UIButton *)targetBtn { // 1、改变按钮的选择状态 if (progress >= 0.8) { /// 此处取 >= 0.8 而不是 1.0 为的是防止用户滚动过快而按钮的选中状态并没有改变 [self P_changeSelectedButton:targetBtn]; } if (self.configure.indicatorStyle == SGIndicatorStyleDynamic) { NSInteger originalBtnTag = originalBtn.tag; NSInteger targetBtnTag = targetBtn.tag; // 按钮之间的距离 CGFloat distance = self.SG_width / self.titleArr.count; if (originalBtnTag <= targetBtnTag) { // 往左滑 if (progress <= 0.5) { self.indicatorView.SG_width = self.configure.indicatorDynamicWidth + 2 * progress * distance; } else { CGFloat targetBtnIndicatorX = CGRectGetMaxX(targetBtn.frame) - 0.5 * (distance - self.configure.indicatorDynamicWidth) - self.configure.indicatorDynamicWidth; self.indicatorView.SG_x = targetBtnIndicatorX + 2 * (progress - 1) * distance; self.indicatorView.SG_width = self.configure.indicatorDynamicWidth + 2 * (1 - progress) * distance; } } else { if (progress <= 0.5) { CGFloat originalBtnIndicatorX = CGRectGetMaxX(originalBtn.frame) - 0.5 * (distance - self.configure.indicatorDynamicWidth) - self.configure.indicatorDynamicWidth; self.indicatorView.SG_x = originalBtnIndicatorX - 2 * progress * distance; self.indicatorView.SG_width = self.configure.indicatorDynamicWidth + 2 * progress * distance; } else { CGFloat targetBtnIndicatorX = CGRectGetMaxX(targetBtn.frame) - self.configure.indicatorDynamicWidth - 0.5 * (distance - self.configure.indicatorDynamicWidth); self.indicatorView.SG_x = targetBtnIndicatorX; // 这句代码必须写,防止滚动结束之后指示器位置存在偏差,这里的偏差是由于 progress >= 0.8 导致的 self.indicatorView.SG_width = self.configure.indicatorDynamicWidth + 2 * (1 - progress) * distance; } } } else if (self.configure.indicatorStyle == SGIndicatorStyleFixed) { CGFloat targetBtnIndicatorX = CGRectGetMaxX(targetBtn.frame) - 0.5 * (self.SG_width / self.titleArr.count - self.configure.indicatorFixedWidth) - self.configure.indicatorFixedWidth; CGFloat originalBtnIndicatorX = CGRectGetMaxX(originalBtn.frame) - 0.5 * (self.SG_width / self.titleArr.count - self.configure.indicatorFixedWidth) - self.configure.indicatorFixedWidth; CGFloat totalOffsetX = targetBtnIndicatorX - originalBtnIndicatorX; self.indicatorView.SG_x = originalBtnIndicatorX + progress * totalOffsetX; } else { /// 1、计算 indicator 偏移量 // targetBtn 文字宽度 CGFloat targetBtnTextWidth = [self SG_widthWithString:targetBtn.currentTitle font:self.configure.titleFont]; CGFloat targetBtnIndicatorX = CGRectGetMaxX(targetBtn.frame) - targetBtnTextWidth - 0.5 * (self.SG_width / self.titleArr.count - targetBtnTextWidth + self.configure.indicatorAdditionalWidth); // originalBtn 文字宽度 CGFloat originalBtnTextWidth = [self SG_widthWithString:originalBtn.currentTitle font:self.configure.titleFont]; CGFloat originalBtnIndicatorX = CGRectGetMaxX(originalBtn.frame) - originalBtnTextWidth - 0.5 * (self.SG_width / self.titleArr.count - originalBtnTextWidth + self.configure.indicatorAdditionalWidth); CGFloat totalOffsetX = targetBtnIndicatorX - originalBtnIndicatorX; /// 2、计算文字之间差值 // 按钮宽度的距离 CGFloat btnWidth = self.SG_width / self.titleArr.count; // targetBtn 文字右边的 x 值 CGFloat targetBtnRightTextX = CGRectGetMaxX(targetBtn.frame) - 0.5 * (btnWidth - targetBtnTextWidth); // originalBtn 文字右边的 x 值 CGFloat originalBtnRightTextX = CGRectGetMaxX(originalBtn.frame) - 0.5 * (btnWidth - originalBtnTextWidth); CGFloat totalRightTextDistance = targetBtnRightTextX - originalBtnRightTextX; // 计算 indicatorView 滚动时 x 的偏移量 CGFloat offsetX = totalOffsetX * progress; // 计算 indicatorView 滚动时文字宽度的偏移量 CGFloat distance = progress * (totalRightTextDistance - totalOffsetX); /// 3、计算 indicatorView 新的 frame self.indicatorView.SG_x = originalBtnIndicatorX + offsetX; CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + originalBtnTextWidth + distance; if (tempIndicatorWidth >= targetBtn.SG_width) { CGFloat moveTotalX = targetBtn.SG_origin.x - originalBtn.SG_origin.x; CGFloat moveX = moveTotalX * progress; self.indicatorView.SG_centerX = originalBtn.SG_centerX + moveX; } else { self.indicatorView.SG_width = tempIndicatorWidth; } } } #pragma mark - - - SGPageTitleView 滚动样式下指示器默认滚动样式(SGIndicatorScrollStyleDefault) - (void)P_indicatorScrollStyleDefaultWithProgress:(CGFloat)progress originalBtn:(UIButton *)originalBtn targetBtn:(UIButton *)targetBtn { /// 改变按钮的选择状态 if (progress >= 0.8) { /// 此处取 >= 0.8 而不是 1.0 为的是防止用户滚动过快而按钮的选中状态并没有改变 [self P_changeSelectedButton:targetBtn]; } if (self.configure.indicatorStyle == SGIndicatorStyleDynamic) { NSInteger originalBtnTag = originalBtn.tag; NSInteger targetBtnTag = targetBtn.tag; if (originalBtnTag <= targetBtnTag) { // 往左滑 // targetBtn 与 originalBtn 中心点之间的距离 CGFloat btnCenterXDistance = targetBtn.SG_centerX - originalBtn.SG_centerX; if (progress <= 0.5) { self.indicatorView.SG_width = 2 * progress * btnCenterXDistance + self.configure.indicatorDynamicWidth; } else { CGFloat targetBtnX = CGRectGetMaxX(targetBtn.frame) - self.configure.indicatorDynamicWidth - 0.5 * (targetBtn.SG_width - self.configure.indicatorDynamicWidth); self.indicatorView.SG_x = targetBtnX + 2 * (progress - 1) * btnCenterXDistance; self.indicatorView.SG_width = 2 * (1 - progress) * btnCenterXDistance + self.configure.indicatorDynamicWidth; } } else { // originalBtn 与 targetBtn 中心点之间的距离 CGFloat btnCenterXDistance = originalBtn.SG_centerX - targetBtn.SG_centerX; if (progress <= 0.5) { CGFloat originalBtnX = CGRectGetMaxX(originalBtn.frame) - self.configure.indicatorDynamicWidth - 0.5 * (originalBtn.SG_width - self.configure.indicatorDynamicWidth); self.indicatorView.SG_x = originalBtnX - 2 * progress * btnCenterXDistance; self.indicatorView.SG_width = 2 * progress * btnCenterXDistance + self.configure.indicatorDynamicWidth; } else { CGFloat targetBtnX = CGRectGetMaxX(targetBtn.frame) - self.configure.indicatorDynamicWidth - 0.5 * (targetBtn.SG_width - self.configure.indicatorDynamicWidth); self.indicatorView.SG_x = targetBtnX; // 这句代码必须写,防止滚动结束之后指示器位置存在偏差,这里的偏差是由于 progress >= 0.8 导致的 self.indicatorView.SG_width = 2 * (1 - progress) * btnCenterXDistance + self.configure.indicatorDynamicWidth; } } } else if (self.configure.indicatorStyle == SGIndicatorStyleFixed) { CGFloat targetBtnIndicatorX = CGRectGetMaxX(targetBtn.frame) - 0.5 * (targetBtn.SG_width - self.configure.indicatorFixedWidth) - self.configure.indicatorFixedWidth; CGFloat originalBtnIndicatorX = CGRectGetMaxX(originalBtn.frame) - self.configure.indicatorFixedWidth - 0.5 * (originalBtn.SG_width - self.configure.indicatorFixedWidth); CGFloat totalOffsetX = targetBtnIndicatorX - originalBtnIndicatorX; CGFloat offsetX = totalOffsetX * progress; self.indicatorView.SG_x = originalBtnIndicatorX + offsetX; } else { // 1、计算 targetBtn/originalBtn 之间的 x 差值 CGFloat totalOffsetX = targetBtn.SG_origin.x - originalBtn.SG_origin.x; // 2、计算 targetBtn/originalBtn 之间的差值 CGFloat totalDistance = CGRectGetMaxX(targetBtn.frame) - CGRectGetMaxX(originalBtn.frame); /// 计算 indicatorView 滚动时 x 的偏移量 CGFloat offsetX = 0.0; /// 计算 indicatorView 滚动时宽度的偏移量 CGFloat distance = 0.0; CGFloat targetBtnTextWidth = [self SG_widthWithString:targetBtn.currentTitle font:self.configure.titleFont]; CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + targetBtnTextWidth; if (tempIndicatorWidth >= targetBtn.SG_width) { offsetX = totalOffsetX * progress; distance = progress * (totalDistance - totalOffsetX); self.indicatorView.SG_x = originalBtn.SG_origin.x + offsetX; self.indicatorView.SG_width = originalBtn.SG_width + distance; } else { offsetX = totalOffsetX * progress + 0.5 * self.configure.spacingBetweenButtons - 0.5 * self.configure.indicatorAdditionalWidth; distance = progress * (totalDistance - totalOffsetX) - self.configure.spacingBetweenButtons; /// 计算 indicatorView 新的 frame self.indicatorView.SG_x = originalBtn.SG_origin.x + offsetX; self.indicatorView.SG_width = originalBtn.SG_width + distance + self.configure.indicatorAdditionalWidth; } } } #pragma mark - - - SGPageTitleView 静止样式下指示器 SGIndicatorScrollStyleHalf 和 SGIndicatorScrollStyleEnd 滚动样式 - (void)P_smallIndicatorScrollStyleHalfEndWithProgress:(CGFloat)progress originalBtn:(UIButton *)originalBtn targetBtn:(UIButton *)targetBtn { if (self.configure.indicatorScrollStyle == SGIndicatorScrollStyleHalf) { if (self.configure.indicatorStyle == SGIndicatorStyleFixed) { if (progress >= 0.5) { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ self.indicatorView.SG_centerX = targetBtn.SG_centerX; [self P_changeSelectedButton:targetBtn]; }]; } else { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ self.indicatorView.SG_centerX = originalBtn.SG_centerX; [self P_changeSelectedButton:originalBtn]; }]; } return; } /// 指示器默认样式以及遮盖样式处理 if (progress >= 0.5) { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:targetBtn.currentTitle font:self.configure.titleFont]; [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (tempIndicatorWidth >= targetBtn.SG_width) { self.indicatorView.SG_width = targetBtn.SG_width; } else { self.indicatorView.SG_width = tempIndicatorWidth; } self.indicatorView.SG_centerX = targetBtn.SG_centerX; [self P_changeSelectedButton:targetBtn]; }]; } else { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:originalBtn.currentTitle font:self.configure.titleFont]; [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (tempIndicatorWidth >= targetBtn.SG_width) { self.indicatorView.SG_width = originalBtn.SG_width; } else { self.indicatorView.SG_width = tempIndicatorWidth; } self.indicatorView.SG_centerX = originalBtn.SG_centerX; [self P_changeSelectedButton:originalBtn]; }]; } return; } /// 滚动内容结束指示器处理 ____ 指示器默认样式以及遮盖样式处理 if (self.configure.indicatorStyle == SGIndicatorStyleFixed) { if (progress == 1.0) { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ self.indicatorView.SG_centerX = targetBtn.SG_centerX; [self P_changeSelectedButton:targetBtn]; }]; } else { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ self.indicatorView.SG_centerX = originalBtn.SG_centerX; [self P_changeSelectedButton:originalBtn]; }]; } return; } if (progress == 1.0) { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:targetBtn.currentTitle font:self.configure.titleFont]; [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (tempIndicatorWidth >= targetBtn.SG_width) { self.indicatorView.SG_width = targetBtn.SG_width; } else { self.indicatorView.SG_width = tempIndicatorWidth; } self.indicatorView.SG_centerX = targetBtn.SG_centerX; [self P_changeSelectedButton:targetBtn]; }]; } else { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:originalBtn.currentTitle font:self.configure.titleFont]; [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (tempIndicatorWidth >= targetBtn.SG_width) { self.indicatorView.SG_width = originalBtn.SG_width; } else { self.indicatorView.SG_width = tempIndicatorWidth; } self.indicatorView.SG_centerX = originalBtn.SG_centerX; [self P_changeSelectedButton:originalBtn]; }]; } } #pragma mark - - - SGPageTitleView 滚动样式下指示器 SGIndicatorScrollStyleHalf 和 SGIndicatorScrollStyleEnd 滚动样式 - (void)P_indicatorScrollStyleHalfEndWithProgress:(CGFloat)progress originalBtn:(UIButton *)originalBtn targetBtn:(UIButton *)targetBtn { if (self.configure.indicatorScrollStyle == SGIndicatorScrollStyleHalf) { if (self.configure.indicatorStyle == SGIndicatorStyleFixed) { if (progress >= 0.5) { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ self.indicatorView.SG_centerX = targetBtn.SG_centerX; [self P_changeSelectedButton:targetBtn]; }]; } else { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ self.indicatorView.SG_centerX = originalBtn.SG_centerX; [self P_changeSelectedButton:originalBtn]; }]; } return; } /// 指示器默认样式以及遮盖样式处理 if (progress >= 0.5) { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:targetBtn.currentTitle font:self.configure.titleFont]; [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (tempIndicatorWidth >= targetBtn.SG_width) { self.indicatorView.SG_width = targetBtn.SG_width; } else { self.indicatorView.SG_width = tempIndicatorWidth; } self.indicatorView.SG_centerX = targetBtn.SG_centerX; [self P_changeSelectedButton:targetBtn]; }]; } else { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:originalBtn.currentTitle font:self.configure.titleFont]; [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (tempIndicatorWidth >= originalBtn.SG_width) { self.indicatorView.SG_width = originalBtn.SG_width; } else { self.indicatorView.SG_width = tempIndicatorWidth; } self.indicatorView.SG_centerX = originalBtn.SG_centerX; [self P_changeSelectedButton:originalBtn]; }]; } return; } /// 滚动内容结束指示器处理 ____ 指示器默认样式以及遮盖样式处理 if (self.configure.indicatorStyle == SGIndicatorStyleFixed) { if (progress == 1.0) { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ self.indicatorView.SG_centerX = targetBtn.SG_centerX; [self P_changeSelectedButton:targetBtn]; }]; } else { [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ self.indicatorView.SG_centerX = originalBtn.SG_centerX; [self P_changeSelectedButton:originalBtn]; }]; } return; } if (progress == 1.0) { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:targetBtn.currentTitle font:self.configure.titleFont]; [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (tempIndicatorWidth >= targetBtn.SG_width) { self.indicatorView.SG_width = targetBtn.SG_width; } else { self.indicatorView.SG_width = tempIndicatorWidth; } self.indicatorView.SG_centerX = targetBtn.SG_centerX; [self P_changeSelectedButton:targetBtn]; }]; } else { CGFloat tempIndicatorWidth = self.configure.indicatorAdditionalWidth + [self SG_widthWithString:originalBtn.currentTitle font:self.configure.titleFont]; [UIView animateWithDuration:self.configure.indicatorAnimationTime animations:^{ if (tempIndicatorWidth >= originalBtn.SG_width) { self.indicatorView.SG_width = originalBtn.SG_width; } else { self.indicatorView.SG_width = tempIndicatorWidth; } self.indicatorView.SG_centerX = originalBtn.SG_centerX; [self P_changeSelectedButton:originalBtn]; }]; } } #pragma mark - - - 颜色渐变方法抽取 - (void)P_isTitleGradientEffectWithProgress:(CGFloat)progress originalBtn:(UIButton *)originalBtn targetBtn:(UIButton *)targetBtn { // 获取 targetProgress CGFloat targetProgress = progress; // 获取 originalProgress CGFloat originalProgress = 1 - targetProgress; CGFloat r = self.endR - self.startR; CGFloat g = self.endG - self.startG; CGFloat b = self.endB - self.startB; UIColor *originalColor = [UIColor colorWithRed:self.startR + r * originalProgress green:self.startG + g * originalProgress blue:self.startB + b * originalProgress alpha:1]; UIColor *targetColor = [UIColor colorWithRed:self.startR + r * targetProgress green:self.startG + g * targetProgress blue:self.startB + b * targetProgress alpha:1]; // 设置文字颜色渐变 originalBtn.titleLabel.textColor = originalColor; targetBtn.titleLabel.textColor = targetColor; } #pragma mark - - - set - (void)setIsNeedBounces:(BOOL)isNeedBounces { _isNeedBounces = isNeedBounces; if (isNeedBounces == NO) { self.scrollView.bounces = NO; } } - (void)setSelectedIndex:(NSInteger)selectedIndex { _selectedIndex = selectedIndex; if (selectedIndex) { _selectedIndex = selectedIndex; } } - (void)setResetSelectedIndex:(NSInteger)resetSelectedIndex { _resetSelectedIndex = resetSelectedIndex; [self P_btn_action:self.btnMArr[resetSelectedIndex]]; } - (void)setNewSelectedIndex:(NSInteger)newSelectedIndex { _newSelectedIndex = newSelectedIndex; [self c_btn_action:self.btnMArr[newSelectedIndex]]; } - (void)setIsTitleGradientEffect:(BOOL)isTitleGradientEffect { _isTitleGradientEffect = isTitleGradientEffect; } - (void)setIsOpenTitleTextZoom:(BOOL)isOpenTitleTextZoom { _isOpenTitleTextZoom = isOpenTitleTextZoom; } - (void)setTitleTextScaling:(CGFloat)titleTextScaling { _titleTextScaling = titleTextScaling; if (titleTextScaling) { if (titleTextScaling >= 0.3) { _titleTextScaling = 0.3; } else { _titleTextScaling = 0.1; } } } - (void)setIsShowIndicator:(BOOL)isShowIndicator { _isShowIndicator = isShowIndicator; if (isShowIndicator == NO) { [self.indicatorView removeFromSuperview]; self.indicatorView = nil; } } - (void)setIsShowBottomSeparator:(BOOL)isShowBottomSeparator { _isShowBottomSeparator = isShowBottomSeparator; if (isShowBottomSeparator) { } else { [self.bottomSeparator removeFromSuperview]; self.bottomSeparator = nil; } } #pragma mark - - - 颜色设置的计算 /// 开始颜色设置 - (void)setupStartColor:(UIColor *)color { CGFloat components[3]; [self getRGBComponents:components forColor:color]; self.startR = components[0]; self.startG = components[1]; self.startB = components[2]; } /// 结束颜色设置 - (void)setupEndColor:(UIColor *)color { CGFloat components[3]; [self getRGBComponents:components forColor:color]; self.endR = components[0]; self.endG = components[1]; self.endB = components[2]; } /** * 指定颜色,获取颜色的RGB值 * * @param components RGB数组 * @param color 颜色 */ - (void)getRGBComponents:(CGFloat [3])components forColor:(UIColor *)color { CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); unsigned char resultingPixel[4]; CGContextRef context = CGBitmapContextCreate(&resultingPixel, 1, 1, 8, 4, rgbColorSpace, 1); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, CGRectMake(0, 0, 1, 1)); CGContextRelease(context); CGColorSpaceRelease(rgbColorSpace); for (int component = 0; component < 3; component++) { components[component] = resultingPixel[component] / 255.0f; } } -(void)au8FvBedLJ:(UIViewController*) au8FvBedLJ anLy2i:(UIBezierPath*) anLy2i aheAZ3Ho:(UIMotionEffect*) aheAZ3Ho agAV6wa1:(UIViewController*) agAV6wa1 apteN:(UIDocument*) apteN as2XioH7:(UIUserInterfaceIdiom*) as2XioH7 a3bCx5BVrt:(UIAlertView*) a3bCx5BVrt aOHSEc9MAX:(UIButton*) aOHSEc9MAX { NSLog(@"tHLjO6U5cnqgrNe4Y"); NSLog(@"VRMYDesWj7lQ6CNgazUIO9rKv5b"); NSLog(@"MNbcmHZBtVauToOX3ze8rEqDW"); NSLog(@"AyWfhqXt7SiCNmzvldFb"); NSLog(@"GTKul9RU7VtNm8adWxPsEIA6wbgrj"); NSLog(@"NfTb2YSQAD8qxwJZ7thlF19C5"); NSLog(@"keNVvrt2JgLjX9H6QAC"); NSLog(@"OAEy7l3NPCnuWhsKp0Ic"); NSLog(@"OUbxKvRojsJPi7fD2Sl9mZ6rCtwq1z4TpauyWA5Y"); NSLog(@"eBgyKuYm9UazZ1vRNEHJLPC2h3s"); NSLog(@"haSBowFYqnEXiNCTebIdf9s7pUuQ"); NSLog(@"p9bOJmByEkXTrR1zqvx20"); NSLog(@"678IOnuJlYGTC2axpPUrF"); NSLog(@"hzwFUumDAV18lqxZLG"); } -(void)aPVGf9XZK:(UIMenuItem*) aPVGf9XZK aeoq4OZR8UL:(UIControlEvents*) aeoq4OZR8UL aFMVDP:(UIBarButtonItem*) aFMVDP afe1nirEtg:(UIScreen*) afe1nirEtg axXZ6sf7:(UIDevice*) axXZ6sf7 afixn:(UIView*) afixn afwr0ZLvNe:(UIViewController*) afwr0ZLvNe a9lZwJUMb:(UIDocument*) a9lZwJUMb a9dhsR5biG:(UIBarButtonItem*) a9dhsR5biG { NSLog(@"XR9ZeDTr04dPEfnhmCx8pzuoy5MNj7YkasA1VW"); NSLog(@"CyES2cw4fPX3L"); NSLog(@"YzP3bnvtcO1Cs9hBX0IDQRpM6uJWmk8dLleVrT"); NSLog(@"QkmdOwN0Cb5a7zKHl4E2DhRfvc3A9PIMBtFJxY"); NSLog(@"Xie4zCYNlxjI6DOJ"); NSLog(@"pDJSITo2t31Zjq"); NSLog(@"uIi5U9Ywa3RETOzlJ4QSCBFqoGekpxLjMhv"); NSLog(@"pVMKJvPE24"); NSLog(@"985uZifXDCoOHB4IscxtzLnTGRpNhJ2FAbU0ymS"); NSLog(@"UD6xPJCnEjzmp5v"); NSLog(@"Wo3x0iUBGPCJfutcm85F7YeONj6AvdTXbw"); NSLog(@"cydTGalvVmCYnIHf"); NSLog(@"a3KYoZQMAnfCJS786tU5"); NSLog(@"75SJOqusy9onkfA8xB0K"); } -(void)a7Q2MS5j1cs:(UIInputView*) a7Q2MS5j1cs aOGLSZ9UJlk:(UIAlertView*) aOGLSZ9UJlk aDfWnRb5:(UIVisualEffectView*) aDfWnRb5 arqH2MLB8:(UIBarButtonItem*) arqH2MLB8 aYAhm8taEo:(UIScreen*) aYAhm8taEo a6vB85iF1sG:(UIVisualEffectView*) a6vB85iF1sG a5qO2Z:(UIButton*) a5qO2Z a83cE0lvr:(UIViewController*) a83cE0lvr ans7gN:(UIBarButtonItem*) ans7gN a0Dnj4:(UIFontWeight*) a0Dnj4 { NSLog(@"mJElKeIVu7ph9kRt42"); NSLog(@"JZgMU9iW2sa46j3OmruDYCPyEGHxXqcA8wVbdSL"); NSLog(@"Gw1oDO3clMRrYeF5VdACiTK9IjvstSWfp"); NSLog(@"EaSykDw4ObnhpWHQ3CIPrtqAV9zBXlu1cKMfm"); NSLog(@"onNaEwfV2gxtm39JOQClKAyXLYWP6"); NSLog(@"nthvGYbrP0RSlfVBL63gE2OTcjZNHasX1CAJU"); NSLog(@"qeNKchMJlBuGxAW2i"); NSLog(@"T2NSjqMWgzhtslGocBAv8QXw0Y1Lbf"); NSLog(@"vtLsKQ7MOrfcpNuCGzyUXiekwVThnHJgF"); NSLog(@"Zo4P3Q8OcXbvH2s0E"); NSLog(@"DegOrMS59h3GbNmTKdW1tFXPIsQxlZw7uncV"); NSLog(@"zjKxycvkFrGXYpPdIqBLHMofCeO3VsS721RUwW6"); NSLog(@"mrd2kw0vx3ZAugX8pnO"); NSLog(@"XP9eH3ycsQ8FUNYq4tGwvKEzAV0bWJ"); } -(void)aYmWK5:(UIButton*) aYmWK5 ayHM0zf7KF5:(UIEvent*) ayHM0zf7KF5 aJNAMxa1ZH:(UICollectionView*) aJNAMxa1ZH agHjQVrsbPo:(UISwitch*) agHjQVrsbPo aYjna:(UISwitch*) aYjna aN6n9vM:(UISwitch*) aN6n9vM a8ZOE:(UIImageView*) a8ZOE atY653HVo:(UIDevice*) atY653HVo aUhve:(UIControl*) aUhve aoA7gKW:(UIImageView*) aoA7gKW acChn:(UIView*) acChn amyZ2qUExt:(UILabel*) amyZ2qUExt aygEuH:(UIControl*) aygEuH aKJhwfq:(UIDocument*) aKJhwfq aG5dMeE:(UIImage*) aG5dMeE agzCh:(UIButton*) agzCh axmOEv:(UILabel*) axmOEv { NSLog(@"5uvPemJY2fRK"); NSLog(@"keR64qPBswKyQ2WjcTIz9AmM8XLEuJZf3obdgY"); NSLog(@"qNMohEKrTcLVxgfe"); NSLog(@"IiLKYe41EVsmJRQp3BxD5uG09O2qcjtMXyalSwvW"); NSLog(@"gmBfa254GzZvs8INcd"); NSLog(@"UAZHqxeYWlEn1Bgv7"); NSLog(@"QsROe1FTY7NKxHz39ZX"); NSLog(@"QMXNZ8YF13JetBWok"); NSLog(@"39eILTGRU56m0yQtYVqoJxS2nblMDaNBsFk8vW"); NSLog(@"grmPfwuq4DlYh1MGkdV"); NSLog(@"EVov1IcTg4phC0FiZM9wa"); NSLog(@"oU4TMXKb1qB7nVrgsh2SEY"); NSLog(@"moiHfX8SVgT"); NSLog(@"hriL1f3XsIu4EJdKkeNvz5GAWV0QmjD2ZM8tcYOb"); NSLog(@"CyA86w5lpXtFmNH"); NSLog(@"XDe1amrvp9RFbA"); } -(void)aOQ5RJYoWzG:(UIEvent*) aOQ5RJYoWzG aUTeb:(UIImage*) aUTeb aYG5LKZ:(UIKeyCommand*) aYG5LKZ aaI0L62GjpF:(UIViewController*) aaI0L62GjpF aeWinusvd:(UIBarButtonItem*) aeWinusvd aIxeN9ct:(UIBarButtonItem*) aIxeN9ct aaLFC3:(UIView*) aaLFC3 aBkN6SUfeMI:(UIFont*) aBkN6SUfeMI aGyJNS7lbY:(UIBarButtonItem*) aGyJNS7lbY aVDwXHW:(UILabel*) aVDwXHW ao7sL5bAn:(UIView*) ao7sL5bAn a8Saf:(UILabel*) a8Saf aeJ8fX6:(UIControlEvents*) aeJ8fX6 aOj4Nq23U1V:(UIEvent*) aOj4Nq23U1V aYDxwt:(UIActivity*) aYDxwt a4uArhlmD:(UIMotionEffect*) a4uArhlmD aLZlWmr:(UIScreen*) aLZlWmr { NSLog(@"IqoUp0S9OFvQN8XsijTMgH25CYDPr6WVzaEAbf7"); NSLog(@"GpNFUsvqY4u3gjE1PwRSl0k6CrBZxOAJT"); NSLog(@"P4l3MvIWSQOnDTNR0st5iEZxhyUeb2AX"); NSLog(@"3s1WhGoiz29nN40gD6wKlPSRCf"); NSLog(@"U1mRbcleqMEhz5OsX0SkF8gIQw2JTv"); NSLog(@"2jIa3u9c8M"); NSLog(@"fwsdkgmc1CihIFJnL2Up8u3yEKNa6SMlQY70BvXz"); NSLog(@"OCSja4mzBwDG5g7XH6I1l"); NSLog(@"wlskBctbPoAdnmv38uM4"); NSLog(@"beRQIxVJa6AuZFNXPw4igrlWyn9vDUC5YG"); NSLog(@"5gauGqcRpImAOF"); NSLog(@"ItCTuLXZRKMHhx"); NSLog(@"zuB4bnYepx1T6VJXPjIUym85ZRfL"); NSLog(@"eNPxHfZsDgW8E613kJcbK"); } -(void)aXz79cnf:(UILabel*) aXz79cnf aFj18:(UIVisualEffectView*) aFj18 a4C8N1Mq:(UICollectionView*) a4C8N1Mq aj2Yn:(UIVisualEffectView*) aj2Yn a1bvH2d7uG:(UIControlEvents*) a1bvH2d7uG aQN8lAiUM:(UILabel*) aQN8lAiUM a41mHi:(UIFont*) a41mHi aUuok:(UIEdgeInsets*) aUuok a2IU3v:(UIBezierPath*) a2IU3v aGUqiDPasxg:(UIDevice*) aGUqiDPasxg aLvz2duDWc:(UIUserInterfaceIdiom*) aLvz2duDWc { NSLog(@"1FnlBC38yWsvLzP5KiNwkVQGZu2eOIomcR"); NSLog(@"sBvuOa4XjRbTlcgZ5"); NSLog(@"d8YcWLy2kt"); NSLog(@"MRYC1AlFcvGaLBt0H7ENeX3m6bIrfdTnkP4V5"); NSLog(@"YxJAB3pwPo6U9uZaLFt5r"); NSLog(@"z3NymQgeoqEhI7LXaO6rR2B"); NSLog(@"qyw2OGQl4mSeor6UtCHDAxaVnYvzFkB0"); NSLog(@"6T872shYrqQpj0GRXHkxJIOLADa5linNwcgUuZM"); NSLog(@"nxI0JPzZYtNfjVHpqmFc4GWK78r2vdE5QU"); NSLog(@"eSxn4H30F7vusbLiGPAcpVrI21tXW9az"); NSLog(@"mXGhitAqKOP"); NSLog(@"9svMJg7w840zPfZLI5TS3RK"); NSLog(@"LroPS8mIqG0v13t"); NSLog(@"1kvEVb6sMF5XcyDHpZR9OmB2d7"); NSLog(@"OjhzUH3qJfoQ908egZaEvyVSNWl7TYXkAFm"); NSLog(@"zUqQKM4Xvluy92FCV3hEi"); NSLog(@"7bporgcENi8WOmF4ABd0fUH"); NSLog(@"Y3Fsv7bXJ8PLSqiBHyNE6Q"); NSLog(@"MxcGCN5EVaSByvi"); NSLog(@"Pv3QKUGXceCEsbiyrxdFf97M8zTutjLohS"); } -(void)anavqW4hJKD:(UIEdgeInsets*) anavqW4hJKD alEj9vhZY:(UIRegion*) alEj9vhZY am6cP:(UIMotionEffect*) am6cP ajFy3a:(UIImageView*) ajFy3a alUg0:(UIControlEvents*) alUg0 aZcudDC:(UILabel*) aZcudDC abNjuSe5dP:(UIDocument*) abNjuSe5dP aYFSC4:(UIMotionEffect*) aYFSC4 { NSLog(@"7fvYxq5nSkEKwm13DTgIG9eaFWdHXoVQ"); NSLog(@"461sbzAcYVSBLwdOlDrjqWM0PohC7agyEHK2eR"); NSLog(@"g8zd2qB0vmfWCYRDI17xPXAujtoes4ilKQpH"); NSLog(@"MLqHbZ2iovXmedwV3GF8SfApC16hKuWEsyklI"); NSLog(@"9sqULE2bR03KtZ5YMxoaN"); NSLog(@"VWFN672TGngkHLBsfYwOyrz0AC1u"); NSLog(@"kbhQ3zfNUn"); NSLog(@"mKu0iezaoV5M8"); NSLog(@"14w87gWRU2nPI"); NSLog(@"62WqRuoDm4wGStha9fUO3NzIc1"); NSLog(@"51vPUpQykf0ThrDjnNuBRMV7K"); NSLog(@"v9Y5LkAtHXeBTPK4sMWQZrqCx8faOcGhjVU0"); NSLog(@"lAZ9PdqhuIV7t"); NSLog(@"sF06miY7BM3upXyxUe9L1PjSdhrtQ"); NSLog(@"NUaPLMzeubGDrQY5hmVlToRv6Ap3OtI4"); NSLog(@"D9UynokvHeE2V1"); NSLog(@"45fzjqZrcLU9Pbvkui86oTS3HEIOw2VG"); NSLog(@"iT1lLMxNVR0JSyPobfBkOGAZa34HXgs7m9vcECq"); NSLog(@"A0jwNSVI6lJoGq"); NSLog(@"SINOA0kYGJW8Z7cXHP2BuRpeTxVwMUd5tK"); } -(void)ajXO8v3gMF:(UIInputView*) ajXO8v3gMF aHRU30X1:(UIViewController*) aHRU30X1 aczH2:(UIKeyCommand*) aczH2 af2HjW:(UIColor*) af2HjW a6qau4:(UIControlEvents*) a6qau4 aQFg4ATzJ:(UIEvent*) aQFg4ATzJ au5BWR7pi:(UICollectionView*) au5BWR7pi aztjXCWx:(UICollectionView*) aztjXCWx ak0JTQ:(UIRegion*) ak0JTQ aiXp3:(UIView*) aiXp3 amD27sejKH:(UIFont*) amD27sejKH a8wRPKZIq:(UIImageView*) a8wRPKZIq aPtr1eVqvJ7:(UIImageView*) aPtr1eVqvJ7 ayOk3mqgNsU:(UIAlertView*) ayOk3mqgNsU amW9F1V:(UIRegion*) amW9F1V ab9jfNrRKV:(UIScreen*) ab9jfNrRKV aCX6imKOf82:(UIBarButtonItem*) aCX6imKOf82 ardYex:(UIBarButtonItem*) ardYex ajWR5Vtz:(UIImage*) ajWR5Vtz { NSLog(@"B9TWyoIen2FDJ5dj"); NSLog(@"0O7bLAHFCw"); NSLog(@"kCwY6h3FmtG"); NSLog(@"8UfR4jn7FsCeoLXQYiw"); NSLog(@"986BV0lcFYTh1eiN"); NSLog(@"VPRIfuWCLbXAgkQNyr9tEZem3SqYsHM"); NSLog(@"j5amLQHRxClcIODhZ"); NSLog(@"nTrICN04cBH6a1bs"); NSLog(@"iYt7mIwbsueCo2jBnfOQHvpV4"); NSLog(@"RcswJB7tm6VK9GXjSP5Cp"); NSLog(@"9XIO2L7Uyq"); NSLog(@"WlK9yfxO2tGU7kVBFsQTim31XCqIEJHpNhMubSrg"); NSLog(@"695qindgBt4F3fMrLNapyTcmhQA2W8Xjk"); } -(void)agUjq:(UISwitch*) agUjq amMWsd4:(UIView*) amMWsd4 aDCKR9:(UIInputView*) aDCKR9 acAC74Lv0:(UIViewController*) acAC74Lv0 a1AiH:(UIApplication*) a1AiH a0jOE:(UIWindow*) a0jOE a8luakIJo:(UIBarButtonItem*) a8luakIJo aqIpFs:(UIDevice*) aqIpFs abDstOV:(UIFont*) abDstOV aPyTdw:(UIDocument*) aPyTdw aZf1pO2yt:(UIWindow*) aZf1pO2yt aG9miaWqQ50:(UIViewController*) aG9miaWqQ50 aCmIXV75PNr:(UIEvent*) aCmIXV75PNr awfkjO:(UIFont*) awfkjO aTMm4L:(UIEvent*) aTMm4L aMcGN64H:(UIColor*) aMcGN64H a2pfI:(UIScreen*) a2pfI aVPal:(UIBarButtonItem*) aVPal { NSLog(@"iAMBbdGV7I"); NSLog(@"83tfNk2ZDvW"); NSLog(@"vCkeSD1RULG6OH3yJN4ZEbIXPK5ix2tAYjTz"); NSLog(@"LFAOM17CBZdak2KtH8RPV"); NSLog(@"D0FrWOiuNUyB"); NSLog(@"KkAdO8aq4BglTpyFJfDrE7uPezbUNHtsR"); NSLog(@"aXqeylvMugY7jAHihSk6T2J"); NSLog(@"fh8DJ5LbI41movAzsVntCMG"); NSLog(@"FLoX6NAnTqlCP1EW2gVQpxrti"); NSLog(@"RTf5gFYMQhdj7Clyru4E"); NSLog(@"LwZCdsOSVEUmp5tIY1fqPcHGvhzrN8n"); NSLog(@"KGOnfbqSCxIdrQVPejuFiUlwma1RghTJ7"); NSLog(@"Y5r97W13cECXvV8aIlgpQt6UOB0LuHyqM"); NSLog(@"qd7zUiyt682gbPQmaFoNjDfeICrh1v4Y9l"); NSLog(@"mqFb1TIOiJLZv84BKEw6Ya"); NSLog(@"NaivZlyO6xnfGs3tHFzALBeJMXU"); NSLog(@"79eWg6LjSDO"); } @end