From 1aa382e59cdf0529d4159c4aa99f0221faf92e5e Mon Sep 17 00:00:00 2001 From: dmanpearl Date: Sat, 21 Sep 2013 09:36:18 -0700 Subject: [PATCH] iOS 7 Theme: Modify artwork and style when iOS 7 OS auto-detected at runtime. --- TSAlertView/TSAlertView.h | 1 + TSAlertView/TSAlertView.m | 114 ++++++++++++++---- TSAlertView/TSAlertViewBackgroundiOS7.png | Bin 0 -> 3285 bytes ...rtViewButtonBackground_HighlightediOS7.png | Bin 0 -> 2904 bytes .../TSAlertViewButtonBackgroundiOS7.png | Bin 0 -> 2820 bytes .../TSAlertViewCancelButtonBackgroundiOS7.png | Bin 0 -> 2820 bytes 6 files changed, 92 insertions(+), 23 deletions(-) mode change 100644 => 100755 TSAlertView/TSAlertView.m create mode 100755 TSAlertView/TSAlertViewBackgroundiOS7.png create mode 100755 TSAlertView/TSAlertViewButtonBackground_HighlightediOS7.png create mode 100755 TSAlertView/TSAlertViewButtonBackgroundiOS7.png create mode 100755 TSAlertView/TSAlertViewCancelButtonBackgroundiOS7.png diff --git a/TSAlertView/TSAlertView.h b/TSAlertView/TSAlertView.h index dfdc97c..0d885a0 100644 --- a/TSAlertView/TSAlertView.h +++ b/TSAlertView/TSAlertView.h @@ -67,6 +67,7 @@ typedef enum @property(nonatomic, retain) UIImage* backgroundImage; @property(nonatomic, assign) TSAlertViewStyle style; @property(nonatomic, readonly) UITextField* inputTextField; +@property(nonatomic, assign) BOOL isiOS7; - (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...; - (NSInteger)addButtonWithTitle:(NSString *)title; diff --git a/TSAlertView/TSAlertView.m b/TSAlertView/TSAlertView.m old mode 100644 new mode 100755 index e83fe74..1d6710b --- a/TSAlertView/TSAlertView.m +++ b/TSAlertView/TSAlertView.m @@ -4,6 +4,8 @@ // Created by Nick Hodapp aka Tom Swift on 1/19/11. // +#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) + #import "TSAlertView.h" #import @@ -126,8 +128,10 @@ @implementation TSAlertView @synthesize style; const CGFloat kTSAlertView_LeftMargin = 10.0; +const CGFloat kTSAlertView_LeftMarginiOS7 = 4.75; const CGFloat kTSAlertView_TopMargin = 16.0; const CGFloat kTSAlertView_BottomMargin = 15.0; +const CGFloat kTSAlertView_BottomMarginiOS7 = 8.5; const CGFloat kTSAlertView_RowMargin = 5.0; const CGFloat kTSAlertView_ColumnMargin = 10.0; @@ -157,12 +161,18 @@ - (id) initWithFrame:(CGRect)frame - (id) initWithTitle: (NSString *) t message: (NSString *) m delegate: (id) d cancelButtonTitle: (NSString *) cancelButtonTitle otherButtonTitles: (NSString *) otherButtonTitles, ... { + if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { + _isiOS7 = YES; + } else { + _isiOS7 = NO; + } + if ( (self = [super init] ) ) // will call into initWithFrame, thus TSAlertView_commonInit is called { self.title = t; self.message = m; self.delegate = d; - + if ( nil != cancelButtonTitle ) { [self addButtonWithTitle: cancelButtonTitle ]; @@ -223,7 +233,6 @@ - (void)dealloc [super dealloc]; } - - (void) TSAlertView_commonInit { self.backgroundColor = [UIColor clearColor]; @@ -236,6 +245,12 @@ - (void) TSAlertView_commonInit buttonLayout = TSAlertViewButtonLayoutNormal; cancelButtonIndex = -1; firstOtherButtonIndex = -1; + + if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { + _isiOS7 = YES; + } else { + _isiOS7 = NO; + } } - (void) setWidth:(CGFloat) w @@ -340,7 +355,13 @@ - (UILabel*) titleLabel _titleLabel = [[UILabel alloc] init]; _titleLabel.font = [UIFont boldSystemFontOfSize: 18]; _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.textColor = [UIColor whiteColor]; + + if(_isiOS7) { + _titleLabel.textColor = [UIColor blackColor]; + } else { + _titleLabel.textColor = [UIColor whiteColor]; + } + _titleLabel.textAlignment = UITextAlignmentCenter; _titleLabel.lineBreakMode = UILineBreakModeWordWrap; _titleLabel.numberOfLines = 0; @@ -356,7 +377,13 @@ - (UILabel*) messageLabel _messageLabel = [[UILabel alloc] init]; _messageLabel.font = [UIFont systemFontOfSize: 16]; _messageLabel.backgroundColor = [UIColor clearColor]; - _messageLabel.textColor = [UIColor whiteColor]; + + if(_isiOS7) { + _messageLabel.textColor = [UIColor blackColor]; + } else { + _messageLabel.textColor = [UIColor whiteColor]; + } + _messageLabel.textAlignment = UITextAlignmentCenter; _messageLabel.lineBreakMode = UILineBreakModeWordWrap; _messageLabel.numberOfLines = 0; @@ -412,7 +439,11 @@ - (UIImage*) backgroundImage { if ( _backgroundImage == nil ) { - self.backgroundImage = [[UIImage imageNamed: @"TSAlertViewBackground.png"] stretchableImageWithLeftCapWidth: 15 topCapHeight: 30]; + if(_isiOS7) { + self.backgroundImage = [[UIImage imageNamed: @"TSAlertViewBackgroundiOS7.png"] stretchableImageWithLeftCapWidth: 15 topCapHeight: 30]; + } else { + self.backgroundImage = [[UIImage imageNamed: @"TSAlertViewBackground.png"] stretchableImageWithLeftCapWidth: 15 topCapHeight: 30]; + } } return _backgroundImage; @@ -454,11 +485,21 @@ - (void) setCancelButtonIndex:(NSInteger)buttonIndex UIButton* b = [self.buttons objectAtIndex: buttonIndex]; - UIImage* buttonBgNormal = [UIImage imageNamed: @"TSAlertViewCancelButtonBackground.png"]; + UIImage* buttonBgNormal; + if(_isiOS7) { + buttonBgNormal = [UIImage imageNamed: @"TSAlertViewCancelButtonBackgroundiOS7.png"]; + } else { + buttonBgNormal = [UIImage imageNamed: @"TSAlertViewCancelButtonBackground.png"]; + } buttonBgNormal = [buttonBgNormal stretchableImageWithLeftCapWidth: buttonBgNormal.size.width / 2.0 topCapHeight: buttonBgNormal.size.height / 2.0]; [b setBackgroundImage: buttonBgNormal forState: UIControlStateNormal]; - UIImage* buttonBgPressed = [UIImage imageNamed: @"TSAlertViewButtonBackground_Highlighted.png"]; + UIImage* buttonBgPressed; + if(_isiOS7) { + buttonBgPressed = [UIImage imageNamed: @"TSAlertViewButtonBackground_HighlightediOS7.png"]; + } else { + buttonBgPressed = [UIImage imageNamed: @"TSAlertViewButtonBackground_Highlighted.png"]; + } buttonBgPressed = [buttonBgPressed stretchableImageWithLeftCapWidth: buttonBgPressed.size.width / 2.0 topCapHeight: buttonBgPressed.size.height / 2.0]; [b setBackgroundImage: buttonBgPressed forState: UIControlStateHighlighted]; } @@ -472,12 +513,26 @@ - (NSInteger) addButtonWithTitle: (NSString *) t { UIButton* b = [UIButton buttonWithType: UIButtonTypeCustom]; [b setTitle: t forState: UIControlStateNormal]; - - UIImage* buttonBgNormal = [UIImage imageNamed: @"TSAlertViewButtonBackground.png"]; + + if(_isiOS7) { + [b setTitleColor:[UIColor colorWithRed:0/255.0 green:122.0/255.0 blue:255.0/255.0 alpha:1] forState:UIControlStateNormal]; + } + + UIImage* buttonBgNormal; + if(_isiOS7) { + buttonBgNormal = [UIImage imageNamed: @"TSAlertViewButtonBackgroundiOS7.png"]; + } else { + buttonBgNormal = [UIImage imageNamed: @"TSAlertViewButtonBackground.png"]; + } buttonBgNormal = [buttonBgNormal stretchableImageWithLeftCapWidth: buttonBgNormal.size.width / 2.0 topCapHeight: buttonBgNormal.size.height / 2.0]; [b setBackgroundImage: buttonBgNormal forState: UIControlStateNormal]; - UIImage* buttonBgPressed = [UIImage imageNamed: @"TSAlertViewButtonBackground_Highlighted.png"]; + UIImage* buttonBgPressed; + if(_isiOS7) { + buttonBgPressed = [UIImage imageNamed: @"TSAlertViewButtonBackground_HighlightediOS7.png"]; + } else { + buttonBgPressed = [UIImage imageNamed: @"TSAlertViewButtonBackground_Highlighted.png"]; + } buttonBgPressed = [buttonBgPressed stretchableImageWithLeftCapWidth: buttonBgPressed.size.width / 2.0 topCapHeight: buttonBgPressed.size.height / 2.0]; [b setBackgroundImage: buttonBgPressed forState: UIControlStateHighlighted]; @@ -629,9 +684,12 @@ - (void) onButtonPress: (id) sender - (CGSize) recalcSizeAndLayout: (BOOL) layout { + const CGFloat leftMargin = _isiOS7 ? kTSAlertView_LeftMarginiOS7 : kTSAlertView_LeftMargin; + const CGFloat bottomMargin = _isiOS7 ? kTSAlertView_BottomMarginiOS7 : kTSAlertView_BottomMargin; + BOOL stacked = !(self.buttonLayout == TSAlertViewButtonLayoutNormal && [self.buttons count] == 2 ); - CGFloat maxWidth = self.width - (kTSAlertView_LeftMargin * 2); + CGFloat maxWidth = self.width - (leftMargin * 2); CGSize titleLabelSize = [self titleLabelSize]; CGSize messageViewSize = [self messageLabelSize]; @@ -640,7 +698,7 @@ - (CGSize) recalcSizeAndLayout: (BOOL) layout CGFloat inputRowHeight = self.style == TSAlertViewStyleInput ? inputTextFieldSize.height + kTSAlertView_RowMargin : 0; - CGFloat totalHeight = kTSAlertView_TopMargin + titleLabelSize.height + kTSAlertView_RowMargin + messageViewSize.height + inputRowHeight + kTSAlertView_RowMargin + buttonsAreaSize.height + kTSAlertView_BottomMargin; + CGFloat totalHeight = kTSAlertView_TopMargin + titleLabelSize.height + kTSAlertView_RowMargin + messageViewSize.height + inputRowHeight + kTSAlertView_RowMargin + buttonsAreaSize.height + bottomMargin; if ( totalHeight > self.maxHeight ) { @@ -661,7 +719,7 @@ - (CGSize) recalcSizeAndLayout: (BOOL) layout CGFloat y = kTSAlertView_TopMargin; if ( self.title != nil ) { - self.titleLabel.frame = CGRectMake( kTSAlertView_LeftMargin, y, titleLabelSize.width, titleLabelSize.height ); + self.titleLabel.frame = CGRectMake( leftMargin, y, titleLabelSize.width, titleLabelSize.height ); [self addSubview: self.titleLabel]; y += titleLabelSize.height + kTSAlertView_RowMargin; } @@ -671,7 +729,7 @@ - (CGSize) recalcSizeAndLayout: (BOOL) layout { if ( self.usesMessageTextView ) { - self.messageTextView.frame = CGRectMake( kTSAlertView_LeftMargin, y, messageViewSize.width, messageViewSize.height ); + self.messageTextView.frame = CGRectMake( leftMargin, y, messageViewSize.width, messageViewSize.height ); [self addSubview: self.messageTextView]; y += messageViewSize.height + kTSAlertView_RowMargin; @@ -681,7 +739,7 @@ - (CGSize) recalcSizeAndLayout: (BOOL) layout } else { - self.messageLabel.frame = CGRectMake( kTSAlertView_LeftMargin, y, messageViewSize.width, messageViewSize.height ); + self.messageLabel.frame = CGRectMake( leftMargin, y, messageViewSize.width, messageViewSize.height ); [self addSubview: self.messageLabel]; y += messageViewSize.height + kTSAlertView_RowMargin; } @@ -690,7 +748,7 @@ - (CGSize) recalcSizeAndLayout: (BOOL) layout // input if ( self.style == TSAlertViewStyleInput ) { - self.inputTextField.frame = CGRectMake( kTSAlertView_LeftMargin, y, inputTextFieldSize.width, inputTextFieldSize.height ); + self.inputTextField.frame = CGRectMake( leftMargin, y, inputTextFieldSize.width, inputTextFieldSize.height ); [self addSubview: self.inputTextField]; y += inputTextFieldSize.height + kTSAlertView_RowMargin; } @@ -702,7 +760,7 @@ - (CGSize) recalcSizeAndLayout: (BOOL) layout CGFloat buttonWidth = maxWidth; for ( UIButton* b in self.buttons ) { - b.frame = CGRectMake( kTSAlertView_LeftMargin, y, buttonWidth, buttonHeight ); + b.frame = CGRectMake( leftMargin, y, buttonWidth, buttonHeight ); [self addSubview: b]; y += buttonHeight + kTSAlertView_RowMargin; } @@ -710,7 +768,7 @@ - (CGSize) recalcSizeAndLayout: (BOOL) layout else { CGFloat buttonWidth = (maxWidth - kTSAlertView_ColumnMargin) / 2.0; - CGFloat x = kTSAlertView_LeftMargin; + CGFloat x = leftMargin; for ( UIButton* b in self.buttons ) { b.frame = CGRectMake( x, y, buttonWidth, buttonHeight ); @@ -726,7 +784,9 @@ - (CGSize) recalcSizeAndLayout: (BOOL) layout - (CGSize) titleLabelSize { - CGFloat maxWidth = self.width - (kTSAlertView_LeftMargin * 2); + const CGFloat leftMargin = _isiOS7 ? kTSAlertView_LeftMarginiOS7 : kTSAlertView_LeftMargin; + + CGFloat maxWidth = self.width - (leftMargin * 2); CGSize s = [self.titleLabel.text sizeWithFont: self.titleLabel.font constrainedToSize: CGSizeMake(maxWidth, 1000) lineBreakMode: self.titleLabel.lineBreakMode]; if ( s.width < maxWidth ) s.width = maxWidth; @@ -736,7 +796,9 @@ - (CGSize) titleLabelSize - (CGSize) messageLabelSize { - CGFloat maxWidth = self.width - (kTSAlertView_LeftMargin * 2); + const CGFloat leftMargin = _isiOS7 ? kTSAlertView_LeftMarginiOS7 : kTSAlertView_LeftMargin; + + CGFloat maxWidth = self.width - (leftMargin * 2); CGSize s = [self.messageLabel.text sizeWithFont: self.messageLabel.font constrainedToSize: CGSizeMake(maxWidth, 1000) lineBreakMode: self.messageLabel.lineBreakMode]; if ( s.width < maxWidth ) s.width = maxWidth; @@ -749,7 +811,9 @@ - (CGSize) inputTextFieldSize if ( self.style == TSAlertViewStyleNormal) return CGSizeZero; - CGFloat maxWidth = self.width - (kTSAlertView_LeftMargin * 2); + const CGFloat leftMargin = _isiOS7 ? kTSAlertView_LeftMarginiOS7 : kTSAlertView_LeftMargin; + + CGFloat maxWidth = self.width - (leftMargin * 2); CGSize s = [self.inputTextField sizeThatFits: CGSizeZero]; @@ -758,7 +822,9 @@ - (CGSize) inputTextFieldSize - (CGSize) buttonsAreaSize_SideBySide { - CGFloat maxWidth = self.width - (kTSAlertView_LeftMargin * 2); + const CGFloat leftMargin = _isiOS7 ? kTSAlertView_LeftMarginiOS7 : kTSAlertView_LeftMargin; + + CGFloat maxWidth = self.width - (leftMargin * 2); CGSize bs = [[self.buttons objectAtIndex:0] sizeThatFits: CGSizeZero]; @@ -769,7 +835,9 @@ - (CGSize) buttonsAreaSize_SideBySide - (CGSize) buttonsAreaSize_Stacked { - CGFloat maxWidth = self.width - (kTSAlertView_LeftMargin * 2); + const CGFloat leftMargin = _isiOS7 ? kTSAlertView_LeftMarginiOS7 : kTSAlertView_LeftMargin; + + CGFloat maxWidth = self.width - (leftMargin * 2); int buttonCount = [self.buttons count]; CGSize bs = [[self.buttons objectAtIndex:0] sizeThatFits: CGSizeZero]; diff --git a/TSAlertView/TSAlertViewBackgroundiOS7.png b/TSAlertView/TSAlertViewBackgroundiOS7.png new file mode 100755 index 0000000000000000000000000000000000000000..5b511e4d44b499db9d19a14393cd64d1e2983fa6 GIT binary patch literal 3285 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 E4F(hwCjbBd literal 0 HcmV?d00001 diff --git a/TSAlertView/TSAlertViewButtonBackground_HighlightediOS7.png b/TSAlertView/TSAlertViewButtonBackground_HighlightediOS7.png new file mode 100755 index 0000000000000000000000000000000000000000..807f19911a137b6d328f20b6585c6b182d6a5313 GIT binary patch literal 2904 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 W_Xd2l;C|8o0000