mirror of
				https://github.com/SoPat712/YTLitePlus.git
				synced 2025-10-31 04:44:14 -04:00 
			
		
		
		
	added files via upload
This commit is contained in:
		
							
								
								
									
										15
									
								
								Tweaks/FLEX/Core/Views/Carousel/FLEXCarouselCell.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								Tweaks/FLEX/Core/Views/Carousel/FLEXCarouselCell.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| // | ||||
| //  FLEXCarouselCell.h | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner Bennett on 7/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import <UIKit/UIKit.h> | ||||
|  | ||||
| @interface FLEXCarouselCell : UICollectionViewCell | ||||
|  | ||||
| @property (nonatomic, copy) NSString *title; | ||||
|  | ||||
| @end | ||||
							
								
								
									
										93
									
								
								Tweaks/FLEX/Core/Views/Carousel/FLEXCarouselCell.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								Tweaks/FLEX/Core/Views/Carousel/FLEXCarouselCell.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| // | ||||
| //  FLEXCarouselCell.m | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner Bennett on 7/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXCarouselCell.h" | ||||
| #import "FLEXColor.h" | ||||
| #import "UIView+FLEX_Layout.h" | ||||
|  | ||||
| @interface FLEXCarouselCell () | ||||
| @property (nonatomic, readonly) UILabel *titleLabel; | ||||
| @property (nonatomic, readonly) UIView *selectionIndicatorStripe; | ||||
| @property (nonatomic) BOOL constraintsInstalled; | ||||
| @end | ||||
|  | ||||
| @implementation FLEXCarouselCell | ||||
|  | ||||
| - (instancetype)initWithFrame:(CGRect)frame { | ||||
|     self = [super initWithFrame:frame]; | ||||
|     if (self) { | ||||
|         _titleLabel = [UILabel new]; | ||||
|         _selectionIndicatorStripe = [UIView new]; | ||||
|  | ||||
|         self.titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; | ||||
|         self.selectionIndicatorStripe.backgroundColor = self.tintColor; | ||||
|         if (@available(iOS 10, *)) { | ||||
|             self.titleLabel.adjustsFontForContentSizeCategory = YES; | ||||
|         } | ||||
|  | ||||
|         [self.contentView addSubview:self.titleLabel]; | ||||
|         [self.contentView addSubview:self.selectionIndicatorStripe]; | ||||
|  | ||||
|         [self installConstraints]; | ||||
|  | ||||
|         [self updateAppearance]; | ||||
|     } | ||||
|  | ||||
|     return self; | ||||
| } | ||||
|  | ||||
| - (void)updateAppearance { | ||||
|     self.selectionIndicatorStripe.hidden = !self.selected; | ||||
|  | ||||
|     if (self.selected) { | ||||
|         self.titleLabel.textColor = self.tintColor; | ||||
|     } else { | ||||
|         self.titleLabel.textColor = FLEXColor.deemphasizedTextColor; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #pragma mark Public | ||||
|  | ||||
| - (NSString *)title { | ||||
|     return self.titleLabel.text; | ||||
| } | ||||
|  | ||||
| - (void)setTitle:(NSString *)title { | ||||
|     self.titleLabel.text = title; | ||||
|     [self.titleLabel sizeToFit]; | ||||
|     [self setNeedsLayout]; | ||||
| } | ||||
|  | ||||
| #pragma mark Overrides | ||||
|  | ||||
| - (void)prepareForReuse { | ||||
|     [super prepareForReuse]; | ||||
|     [self updateAppearance]; | ||||
| } | ||||
|  | ||||
| - (void)installConstraints { | ||||
|     CGFloat stripeHeight = 2; | ||||
|  | ||||
|     self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO; | ||||
|     self.selectionIndicatorStripe.translatesAutoresizingMaskIntoConstraints = NO; | ||||
|  | ||||
|     UIView *superview = self.contentView; | ||||
|     [self.titleLabel flex_pinEdgesToSuperviewWithInsets:UIEdgeInsetsMake(10, 15, 8 + stripeHeight, 15)]; | ||||
|  | ||||
|     [self.selectionIndicatorStripe.leadingAnchor constraintEqualToAnchor:superview.leadingAnchor].active = YES; | ||||
|     [self.selectionIndicatorStripe.bottomAnchor constraintEqualToAnchor:superview.bottomAnchor].active = YES; | ||||
|     [self.selectionIndicatorStripe.trailingAnchor constraintEqualToAnchor:superview.trailingAnchor].active = YES; | ||||
|     [self.selectionIndicatorStripe.heightAnchor constraintEqualToConstant:stripeHeight].active = YES; | ||||
| } | ||||
|  | ||||
| - (void)setSelected:(BOOL)selected { | ||||
|     super.selected = selected; | ||||
|     [self updateAppearance]; | ||||
| } | ||||
|  | ||||
| @end | ||||
							
								
								
									
										20
									
								
								Tweaks/FLEX/Core/Views/Carousel/FLEXScopeCarousel.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Tweaks/FLEX/Core/Views/Carousel/FLEXScopeCarousel.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| // | ||||
| //  FLEXScopeCarousel.h | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner Bennett on 7/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import <UIKit/UIKit.h> | ||||
|  | ||||
| /// Only use on iOS 10 and up. Requires iOS 10 APIs for calculating row sizes. | ||||
| @interface FLEXScopeCarousel : UIControl | ||||
|  | ||||
| @property (nonatomic, copy) NSArray<NSString *> *items; | ||||
| @property (nonatomic) NSInteger selectedIndex; | ||||
| @property (nonatomic) void(^selectedIndexChangedAction)(NSInteger idx); | ||||
|  | ||||
| - (void)registerBlockForDynamicTypeChanges:(void(^)(FLEXScopeCarousel *))handler; | ||||
|  | ||||
| @end | ||||
							
								
								
									
										204
									
								
								Tweaks/FLEX/Core/Views/Carousel/FLEXScopeCarousel.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								Tweaks/FLEX/Core/Views/Carousel/FLEXScopeCarousel.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,204 @@ | ||||
| // | ||||
| //  FLEXScopeCarousel.m | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner Bennett on 7/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXScopeCarousel.h" | ||||
| #import "FLEXCarouselCell.h" | ||||
| #import "FLEXColor.h" | ||||
| #import "FLEXMacros.h" | ||||
| #import "UIView+FLEX_Layout.h" | ||||
|  | ||||
| const CGFloat kCarouselItemSpacing = 0; | ||||
| NSString * const kCarouselCellReuseIdentifier = @"kCarouselCellReuseIdentifier"; | ||||
|  | ||||
| @interface FLEXScopeCarousel () <UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> | ||||
| @property (nonatomic, readonly) UICollectionView *collectionView; | ||||
| @property (nonatomic, readonly) FLEXCarouselCell *sizingCell; | ||||
|  | ||||
| @property (nonatomic, readonly) id dynamicTypeObserver; | ||||
| @property (nonatomic, readonly) NSMutableArray *dynamicTypeHandlers; | ||||
|  | ||||
| @property (nonatomic) BOOL constraintsInstalled; | ||||
| @end | ||||
|  | ||||
| @implementation FLEXScopeCarousel | ||||
|  | ||||
| - (id)initWithFrame:(CGRect)frame { | ||||
|     self = [super initWithFrame:frame]; | ||||
|     if (self) { | ||||
|         self.backgroundColor = FLEXColor.primaryBackgroundColor; | ||||
|         self.autoresizingMask = UIViewAutoresizingFlexibleWidth; | ||||
|         self.translatesAutoresizingMaskIntoConstraints = YES; | ||||
|         _dynamicTypeHandlers = [NSMutableArray new]; | ||||
|          | ||||
|         CGSize itemSize = CGSizeZero; | ||||
|         if (@available(iOS 10.0, *)) { | ||||
|             itemSize = UICollectionViewFlowLayoutAutomaticSize; | ||||
|         } | ||||
|  | ||||
|         // Collection view layout | ||||
|         UICollectionViewFlowLayout *layout = ({ | ||||
|             UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new]; | ||||
|             layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; | ||||
|             layout.sectionInset = UIEdgeInsetsZero; | ||||
|             layout.minimumLineSpacing = kCarouselItemSpacing; | ||||
|             layout.itemSize = itemSize; | ||||
|             layout.estimatedItemSize = itemSize; | ||||
|             layout; | ||||
|         }); | ||||
|  | ||||
|         // Collection view | ||||
|         _collectionView = ({ | ||||
|             UICollectionView *cv = [[UICollectionView alloc] | ||||
|                 initWithFrame:CGRectZero | ||||
|                 collectionViewLayout:layout | ||||
|             ]; | ||||
|             cv.showsHorizontalScrollIndicator = NO; | ||||
|             cv.backgroundColor = UIColor.clearColor; | ||||
|             cv.delegate = self; | ||||
|             cv.dataSource = self; | ||||
|             [cv registerClass:[FLEXCarouselCell class] forCellWithReuseIdentifier:kCarouselCellReuseIdentifier]; | ||||
|  | ||||
|             [self addSubview:cv]; | ||||
|             cv; | ||||
|         }); | ||||
|  | ||||
|  | ||||
|         // Sizing cell | ||||
|         _sizingCell = [FLEXCarouselCell new]; | ||||
|         self.sizingCell.title = @"NSObject"; | ||||
|  | ||||
|         // Dynamic type | ||||
|         weakify(self); | ||||
|         _dynamicTypeObserver = [NSNotificationCenter.defaultCenter | ||||
|             addObserverForName:UIContentSizeCategoryDidChangeNotification | ||||
|             object:nil queue:nil usingBlock:^(NSNotification *note) { strongify(self) | ||||
|                 [self.collectionView setNeedsLayout]; | ||||
|                 [self setNeedsUpdateConstraints]; | ||||
|  | ||||
|                 // Notify observers | ||||
|                 for (void (^block)(FLEXScopeCarousel *) in self.dynamicTypeHandlers) { | ||||
|                     block(self); | ||||
|                 } | ||||
|             } | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     return self; | ||||
| } | ||||
|  | ||||
| - (void)dealloc { | ||||
|     [NSNotificationCenter.defaultCenter removeObserver:self.dynamicTypeObserver]; | ||||
| } | ||||
|  | ||||
| #pragma mark - Overrides | ||||
|  | ||||
| - (void)drawRect:(CGRect)rect { | ||||
|     [super drawRect:rect]; | ||||
|  | ||||
|     CGFloat width = 1.f / UIScreen.mainScreen.scale; | ||||
|  | ||||
|     // Draw hairline | ||||
|     CGContextRef context = UIGraphicsGetCurrentContext(); | ||||
|     CGContextSetStrokeColorWithColor(context, FLEXColor.hairlineColor.CGColor); | ||||
|     CGContextSetLineWidth(context, width); | ||||
|     CGContextMoveToPoint(context, 0, rect.size.height - width); | ||||
|     CGContextAddLineToPoint(context, rect.size.width, rect.size.height - width); | ||||
|     CGContextStrokePath(context); | ||||
| } | ||||
|  | ||||
| + (BOOL)requiresConstraintBasedLayout { | ||||
|     return YES; | ||||
| } | ||||
|  | ||||
| - (void)updateConstraints { | ||||
|     if (!self.constraintsInstalled) { | ||||
|         self.collectionView.translatesAutoresizingMaskIntoConstraints = NO; | ||||
|         [self.collectionView flex_pinEdgesToSuperview]; | ||||
|          | ||||
|         self.constraintsInstalled = YES; | ||||
|     } | ||||
|      | ||||
|     [super updateConstraints]; | ||||
| } | ||||
|  | ||||
| - (CGSize)intrinsicContentSize { | ||||
|     return CGSizeMake( | ||||
|         UIViewNoIntrinsicMetric, | ||||
|         [self.sizingCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height | ||||
|     ); | ||||
| } | ||||
|  | ||||
| #pragma mark - Public | ||||
|  | ||||
| - (void)setItems:(NSArray<NSString *> *)items { | ||||
|     NSParameterAssert(items.count); | ||||
|  | ||||
|     _items = items.copy; | ||||
|  | ||||
|     // Refresh list, select first item initially | ||||
|     [self.collectionView reloadData]; | ||||
|     self.selectedIndex = 0; | ||||
| } | ||||
|  | ||||
| - (void)setSelectedIndex:(NSInteger)idx { | ||||
|     NSParameterAssert(idx < self.items.count); | ||||
|  | ||||
|     _selectedIndex = idx; | ||||
|     NSIndexPath *path = [NSIndexPath indexPathForItem:idx inSection:0]; | ||||
|     [self.collectionView selectItemAtIndexPath:path | ||||
|                                       animated:YES | ||||
|                                 scrollPosition:UICollectionViewScrollPositionCenteredHorizontally]; | ||||
|     [self collectionView:self.collectionView didSelectItemAtIndexPath:path]; | ||||
| } | ||||
|  | ||||
| - (void)registerBlockForDynamicTypeChanges:(void (^)(FLEXScopeCarousel *))handler { | ||||
|     [self.dynamicTypeHandlers addObject:handler]; | ||||
| } | ||||
|  | ||||
| #pragma mark - UICollectionView | ||||
|  | ||||
| - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { | ||||
| //    if (@available(iOS 10.0, *)) { | ||||
| //        return UICollectionViewFlowLayoutAutomaticSize; | ||||
| //    } | ||||
|      | ||||
|     self.sizingCell.title = self.items[indexPath.item]; | ||||
|     return [self.sizingCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; | ||||
| } | ||||
|  | ||||
| - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { | ||||
|     return self.items.count; | ||||
| } | ||||
|  | ||||
| - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView | ||||
|                   cellForItemAtIndexPath:(NSIndexPath *)indexPath { | ||||
|     FLEXCarouselCell *cell = (id)[collectionView dequeueReusableCellWithReuseIdentifier:kCarouselCellReuseIdentifier | ||||
|                                                                            forIndexPath:indexPath]; | ||||
|     cell.title = self.items[indexPath.row]; | ||||
|     return cell; | ||||
| } | ||||
|  | ||||
| - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { | ||||
|     _selectedIndex = indexPath.item; // In case self.selectedIndex didn't trigger this call | ||||
|  | ||||
|     if (self.selectedIndexChangedAction) { | ||||
|         self.selectedIndexChangedAction(indexPath.row); | ||||
|     } | ||||
|  | ||||
|     // TODO: dynamically choose a scroll position. Very wide items should | ||||
|     // get "Left" while smaller items should not scroll at all, unless | ||||
|     // they are only partially on the screen, in which case they | ||||
|     // should get "HorizontallyCentered" to bring them onto the screen. | ||||
|     // For now, everything goes to the left, as this has a similar effect. | ||||
|     [collectionView scrollToItemAtIndexPath:indexPath | ||||
|                            atScrollPosition:UICollectionViewScrollPositionLeft | ||||
|                                    animated:YES]; | ||||
|     [self sendActionsForControlEvents:UIControlEventValueChanged]; | ||||
| } | ||||
|  | ||||
| @end | ||||
							
								
								
									
										17
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXCodeFontCell.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXCodeFontCell.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| // | ||||
| //  FLEXCodeFontCell.h | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner on 12/27/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXMultilineTableViewCell.h" | ||||
|  | ||||
| NS_ASSUME_NONNULL_BEGIN | ||||
|  | ||||
| @interface FLEXCodeFontCell : FLEXMultilineDetailTableViewCell | ||||
|  | ||||
| @end | ||||
|  | ||||
| NS_ASSUME_NONNULL_END | ||||
							
								
								
									
										34
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXCodeFontCell.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXCodeFontCell.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| // | ||||
| //  FLEXCodeFontCell.m | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner on 12/27/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXCodeFontCell.h" | ||||
| #import "UIFont+FLEX.h" | ||||
|  | ||||
| @implementation FLEXCodeFontCell | ||||
|  | ||||
| - (void)postInit { | ||||
|     [super postInit]; | ||||
|      | ||||
|     self.titleLabel.font = UIFont.flex_codeFont; | ||||
|     self.subtitleLabel.font = UIFont.flex_codeFont; | ||||
|  | ||||
|     self.titleLabel.adjustsFontSizeToFitWidth = YES; | ||||
|     self.titleLabel.minimumScaleFactor = 0.9; | ||||
|     self.subtitleLabel.adjustsFontSizeToFitWidth = YES; | ||||
|     self.subtitleLabel.minimumScaleFactor = 0.75; | ||||
|      | ||||
|     // Disable mutli-line pre iOS 11 | ||||
|     if (@available(iOS 11, *)) { | ||||
|         self.subtitleLabel.numberOfLines = 5; | ||||
|     } else { | ||||
|         self.titleLabel.numberOfLines = 1; | ||||
|         self.subtitleLabel.numberOfLines = 1; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @end | ||||
							
								
								
									
										13
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXKeyValueTableViewCell.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXKeyValueTableViewCell.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // | ||||
| //  FLEXKeyValueTableViewCell.h | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner Bennett on 1/23/20. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXTableViewCell.h" | ||||
|  | ||||
| @interface FLEXKeyValueTableViewCell : FLEXTableViewCell | ||||
|  | ||||
| @end | ||||
							
								
								
									
										17
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXKeyValueTableViewCell.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXKeyValueTableViewCell.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| // | ||||
| //  FLEXKeyValueTableViewCell.m | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner Bennett on 1/23/20. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXKeyValueTableViewCell.h" | ||||
|  | ||||
| @implementation FLEXKeyValueTableViewCell | ||||
|  | ||||
| - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { | ||||
|     return [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier]; | ||||
| } | ||||
|  | ||||
| @end | ||||
							
								
								
									
										24
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXMultilineTableViewCell.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXMultilineTableViewCell.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| // | ||||
| //  FLEXMultilineTableViewCell.h | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Ryan Olson on 2/13/15. | ||||
| //  Copyright (c) 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXTableViewCell.h" | ||||
|  | ||||
| /// A cell with both labels set to be multi-line capable. | ||||
| @interface FLEXMultilineTableViewCell : FLEXTableViewCell | ||||
|  | ||||
| + (CGFloat)preferredHeightWithAttributedText:(NSAttributedString *)attributedText | ||||
|                                     maxWidth:(CGFloat)contentViewWidth | ||||
|                                        style:(UITableViewStyle)style | ||||
|                               showsAccessory:(BOOL)showsAccessory; | ||||
|  | ||||
| @end | ||||
|  | ||||
| /// A \c FLEXMultilineTableViewCell initialized with \c UITableViewCellStyleSubtitle | ||||
| @interface FLEXMultilineDetailTableViewCell : FLEXMultilineTableViewCell | ||||
|  | ||||
| @end | ||||
							
								
								
									
										67
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXMultilineTableViewCell.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXMultilineTableViewCell.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| // | ||||
| //  FLEXMultilineTableViewCell.m | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Ryan Olson on 2/13/15. | ||||
| //  Copyright (c) 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXMultilineTableViewCell.h" | ||||
| #import "UIView+FLEX_Layout.h" | ||||
| #import "FLEXUtility.h" | ||||
|  | ||||
| @interface FLEXMultilineTableViewCell () | ||||
| @property (nonatomic, readonly) UILabel *_titleLabel; | ||||
| @property (nonatomic, readonly) UILabel *_subtitleLabel; | ||||
| @property (nonatomic) BOOL constraintsUpdated; | ||||
| @end | ||||
|  | ||||
| @implementation FLEXMultilineTableViewCell | ||||
|  | ||||
| - (void)postInit { | ||||
|     [super postInit]; | ||||
|      | ||||
|     self.titleLabel.numberOfLines = 0; | ||||
|     self.subtitleLabel.numberOfLines = 0; | ||||
| } | ||||
|  | ||||
| + (UIEdgeInsets)labelInsets { | ||||
|     return UIEdgeInsetsMake(10.0, 16.0, 10.0, 8.0); | ||||
| } | ||||
|  | ||||
| + (CGFloat)preferredHeightWithAttributedText:(NSAttributedString *)attributedText | ||||
|                                     maxWidth:(CGFloat)contentViewWidth | ||||
|                                        style:(UITableViewStyle)style | ||||
|                               showsAccessory:(BOOL)showsAccessory { | ||||
|     CGFloat labelWidth = contentViewWidth; | ||||
|  | ||||
|     // Content view inset due to accessory view observed on iOS 8.1 iPhone 6. | ||||
|     if (showsAccessory) { | ||||
|         labelWidth -= 34.0; | ||||
|     } | ||||
|  | ||||
|     UIEdgeInsets labelInsets = [self labelInsets]; | ||||
|     labelWidth -= (labelInsets.left + labelInsets.right); | ||||
|  | ||||
|     CGSize constrainSize = CGSizeMake(labelWidth, CGFLOAT_MAX); | ||||
|     CGRect boundingBox = [attributedText | ||||
|         boundingRectWithSize:constrainSize | ||||
|         options:NSStringDrawingUsesLineFragmentOrigin | ||||
|         context:nil | ||||
|     ]; | ||||
|     CGFloat preferredLabelHeight = FLEXFloor(boundingBox.size.height); | ||||
|     CGFloat preferredCellHeight = preferredLabelHeight + labelInsets.top + labelInsets.bottom + 1.0; | ||||
|  | ||||
|     return preferredCellHeight; | ||||
| } | ||||
|  | ||||
| @end | ||||
|  | ||||
|  | ||||
| @implementation FLEXMultilineDetailTableViewCell | ||||
|  | ||||
| - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { | ||||
|     return [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier]; | ||||
| } | ||||
|  | ||||
| @end | ||||
							
								
								
									
										14
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXSubtitleTableViewCell.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXSubtitleTableViewCell.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| // | ||||
| //  FLEXSubtitleTableViewCell.h | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner on 4/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXTableViewCell.h" | ||||
|  | ||||
| /// A cell initialized with \c UITableViewCellStyleSubtitle | ||||
| @interface FLEXSubtitleTableViewCell : FLEXTableViewCell | ||||
|  | ||||
| @end | ||||
							
								
								
									
										17
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXSubtitleTableViewCell.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXSubtitleTableViewCell.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| // | ||||
| //  FLEXSubtitleTableViewCell.m | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner on 4/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXSubtitleTableViewCell.h" | ||||
|  | ||||
| @implementation FLEXSubtitleTableViewCell | ||||
|  | ||||
| - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { | ||||
|     return [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier]; | ||||
| } | ||||
|  | ||||
| @end | ||||
							
								
								
									
										23
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXTableViewCell.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXTableViewCell.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| // | ||||
| //  FLEXTableViewCell.h | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner on 4/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import <UIKit/UIKit.h> | ||||
|  | ||||
| @interface FLEXTableViewCell : UITableViewCell | ||||
|  | ||||
| /// Use this instead of .textLabel | ||||
| @property (nonatomic, readonly) UILabel *titleLabel; | ||||
| /// Use this instead of .detailTextLabel | ||||
| @property (nonatomic, readonly) UILabel *subtitleLabel; | ||||
|  | ||||
| /// Subclasses can override this instead of initializers to | ||||
| /// perform additional initialization without lots of boilerplate. | ||||
| /// Remember to call super! | ||||
| - (void)postInit; | ||||
|  | ||||
| @end | ||||
							
								
								
									
										57
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXTableViewCell.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								Tweaks/FLEX/Core/Views/Cells/FLEXTableViewCell.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| // | ||||
| //  FLEXTableViewCell.m | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner on 4/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXTableViewCell.h" | ||||
| #import "FLEXUtility.h" | ||||
| #import "FLEXColor.h" | ||||
| #import "FLEXTableView.h" | ||||
|  | ||||
| @interface UITableView (Internal) | ||||
| // Exists at least since iOS 5 | ||||
| - (BOOL)_canPerformAction:(SEL)action forCell:(UITableViewCell *)cell sender:(id)sender; | ||||
| - (void)_performAction:(SEL)action forCell:(UITableViewCell *)cell sender:(id)sender; | ||||
| @end | ||||
|  | ||||
| @interface UITableViewCell (Internal) | ||||
| // Exists at least since iOS 5 | ||||
| @property (nonatomic, readonly) FLEXTableView *_tableView; | ||||
| @end | ||||
|  | ||||
| @implementation FLEXTableViewCell | ||||
|  | ||||
| - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { | ||||
|     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; | ||||
|     if (self) { | ||||
|         [self postInit]; | ||||
|     } | ||||
|  | ||||
|     return self; | ||||
| } | ||||
|  | ||||
| - (void)postInit { | ||||
|     UIFont *cellFont = UIFont.flex_defaultTableCellFont; | ||||
|     self.titleLabel.font = cellFont; | ||||
|     self.subtitleLabel.font = cellFont; | ||||
|     self.subtitleLabel.textColor = FLEXColor.deemphasizedTextColor; | ||||
|      | ||||
|     self.titleLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; | ||||
|     self.subtitleLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; | ||||
|      | ||||
|     self.titleLabel.numberOfLines = 1; | ||||
|     self.subtitleLabel.numberOfLines = 1; | ||||
| } | ||||
|  | ||||
| - (UILabel *)titleLabel { | ||||
|     return self.textLabel; | ||||
| } | ||||
|  | ||||
| - (UILabel *)subtitleLabel { | ||||
|     return self.detailTextLabel; | ||||
| } | ||||
|  | ||||
| @end | ||||
							
								
								
									
										48
									
								
								Tweaks/FLEX/Core/Views/FLEXTableView.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Tweaks/FLEX/Core/Views/FLEXTableView.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| // | ||||
| //  FLEXTableView.h | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner on 4/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import <UIKit/UIKit.h> | ||||
|  | ||||
| NS_ASSUME_NONNULL_BEGIN | ||||
|  | ||||
| #pragma mark Reuse identifiers | ||||
|  | ||||
| typedef NSString * FLEXTableViewCellReuseIdentifier; | ||||
|  | ||||
| /// A regular \c FLEXTableViewCell initialized with \c UITableViewCellStyleDefault | ||||
| extern FLEXTableViewCellReuseIdentifier const kFLEXDefaultCell; | ||||
| /// A \c FLEXSubtitleTableViewCell initialized with \c UITableViewCellStyleSubtitle | ||||
| extern FLEXTableViewCellReuseIdentifier const kFLEXDetailCell; | ||||
| /// A \c FLEXMultilineTableViewCell initialized with \c UITableViewCellStyleDefault | ||||
| extern FLEXTableViewCellReuseIdentifier const kFLEXMultilineCell; | ||||
| /// A \c FLEXMultilineTableViewCell initialized with \c UITableViewCellStyleSubtitle | ||||
| extern FLEXTableViewCellReuseIdentifier const kFLEXMultilineDetailCell; | ||||
| /// A \c FLEXTableViewCell initialized with \c UITableViewCellStyleValue1 | ||||
| extern FLEXTableViewCellReuseIdentifier const kFLEXKeyValueCell; | ||||
| /// A \c FLEXSubtitleTableViewCell which uses monospaced fonts for both labels | ||||
| extern FLEXTableViewCellReuseIdentifier const kFLEXCodeFontCell; | ||||
|  | ||||
| #pragma mark - FLEXTableView | ||||
| @interface FLEXTableView : UITableView | ||||
|  | ||||
| + (instancetype)flexDefaultTableView; | ||||
| + (instancetype)groupedTableView; | ||||
| + (instancetype)plainTableView; | ||||
| + (instancetype)style:(UITableViewStyle)style; | ||||
|  | ||||
| /// You do not need to register classes for any of the default reuse identifiers above | ||||
| /// (annotated as \c FLEXTableViewCellReuseIdentifier types) unless you wish to provide | ||||
| /// a custom cell for any of those reuse identifiers. By default, \c FLEXTableViewCell, | ||||
| /// \c FLEXSubtitleTableViewCell, and \c FLEXMultilineTableViewCell are used, respectively. | ||||
| /// | ||||
| /// @param registrationMapping A map of reuse identifiers to \c UITableViewCell (sub)class objects. | ||||
| - (void)registerCells:(NSDictionary<NSString *, Class> *)registrationMapping; | ||||
|  | ||||
| @end | ||||
|  | ||||
| NS_ASSUME_NONNULL_END | ||||
							
								
								
									
										83
									
								
								Tweaks/FLEX/Core/Views/FLEXTableView.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								Tweaks/FLEX/Core/Views/FLEXTableView.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| // | ||||
| //  FLEXTableView.m | ||||
| //  FLEX | ||||
| // | ||||
| //  Created by Tanner on 4/17/19. | ||||
| //  Copyright © 2020 FLEX Team. All rights reserved. | ||||
| // | ||||
|  | ||||
| #import "FLEXTableView.h" | ||||
| #import "FLEXUtility.h" | ||||
| #import "FLEXSubtitleTableViewCell.h" | ||||
| #import "FLEXMultilineTableViewCell.h" | ||||
| #import "FLEXKeyValueTableViewCell.h" | ||||
| #import "FLEXCodeFontCell.h" | ||||
|  | ||||
| FLEXTableViewCellReuseIdentifier const kFLEXDefaultCell = @"kFLEXDefaultCell"; | ||||
| FLEXTableViewCellReuseIdentifier const kFLEXDetailCell = @"kFLEXDetailCell"; | ||||
| FLEXTableViewCellReuseIdentifier const kFLEXMultilineCell = @"kFLEXMultilineCell"; | ||||
| FLEXTableViewCellReuseIdentifier const kFLEXMultilineDetailCell = @"kFLEXMultilineDetailCell"; | ||||
| FLEXTableViewCellReuseIdentifier const kFLEXKeyValueCell = @"kFLEXKeyValueCell"; | ||||
| FLEXTableViewCellReuseIdentifier const kFLEXCodeFontCell = @"kFLEXCodeFontCell"; | ||||
|  | ||||
| #pragma mark Private | ||||
|  | ||||
| @interface UITableView (Private) | ||||
| - (CGFloat)_heightForHeaderInSection:(NSInteger)section; | ||||
| - (NSString *)_titleForHeaderInSection:(NSInteger)section; | ||||
| @end | ||||
|  | ||||
| @implementation FLEXTableView | ||||
|  | ||||
| + (instancetype)flexDefaultTableView { | ||||
|     if (@available(iOS 13.0, *)) { | ||||
|         return [[self alloc] initWithFrame:CGRectZero style:UITableViewStyleInsetGrouped]; | ||||
|     } else { | ||||
|         return [[self alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #pragma mark - Initialization | ||||
|  | ||||
| + (id)groupedTableView { | ||||
|     if (@available(iOS 13.0, *)) { | ||||
|         return [[self alloc] initWithFrame:CGRectZero style:UITableViewStyleInsetGrouped]; | ||||
|     } else { | ||||
|         return [[self alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| + (id)plainTableView { | ||||
|     return [[self alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; | ||||
| } | ||||
|  | ||||
| + (id)style:(UITableViewStyle)style { | ||||
|     return [[self alloc] initWithFrame:CGRectZero style:style]; | ||||
| } | ||||
|  | ||||
| - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style { | ||||
|     self = [super initWithFrame:frame style:style]; | ||||
|     if (self) { | ||||
|         [self registerCells:@{ | ||||
|             kFLEXDefaultCell : [FLEXTableViewCell class], | ||||
|             kFLEXDetailCell : [FLEXSubtitleTableViewCell class], | ||||
|             kFLEXMultilineCell : [FLEXMultilineTableViewCell class], | ||||
|             kFLEXMultilineDetailCell : [FLEXMultilineDetailTableViewCell class], | ||||
|             kFLEXKeyValueCell : [FLEXKeyValueTableViewCell class], | ||||
|             kFLEXCodeFontCell : [FLEXCodeFontCell class], | ||||
|         }]; | ||||
|     } | ||||
|  | ||||
|     return self; | ||||
| } | ||||
|  | ||||
|  | ||||
| #pragma mark - Public | ||||
|  | ||||
| - (void)registerCells:(NSDictionary<NSString*, Class> *)registrationMapping { | ||||
|     [registrationMapping enumerateKeysAndObjectsUsingBlock:^(NSString *identifier, Class cellClass, BOOL *stop) { | ||||
|         [self registerClass:cellClass forCellReuseIdentifier:identifier]; | ||||
|     }]; | ||||
| } | ||||
|  | ||||
| @end | ||||
		Reference in New Issue
	
	Block a user
	 Balackburn
					Balackburn