From c93c91eb7e602425fa42c8ad47b6c5e8588fb4f6 Mon Sep 17 00:00:00 2001 From: asarazan Date: Fri, 17 Jun 2011 11:59:41 -0700 Subject: [PATCH 1/7] adding to window accounts for status bar, also removed some code duplication since UIWindow isa UIView --- MKInfoBundle/MKInfoPanel.m | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/MKInfoBundle/MKInfoPanel.m b/MKInfoBundle/MKInfoPanel.m index 69e946a..4266f65 100644 --- a/MKInfoBundle/MKInfoPanel.m +++ b/MKInfoBundle/MKInfoPanel.m @@ -81,7 +81,7 @@ +(MKInfoPanel*) infoPanel return panel; } -+(void) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval ++(MKInfoPanel*) showPanelHelper:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval { MKInfoPanel *panel = [MKInfoPanel infoPanel]; [panel setType:type]; @@ -100,29 +100,25 @@ +(void) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSStri } [view addSubview:panel]; - [panel performSelector:@selector(hidePanel) withObject:view afterDelay:interval]; + [panel performSelector:@selector(hidePanel) withObject:view afterDelay:interval]; + + return panel; +} + ++(void) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval +{ + MKInfoPanel *panel = [self showPanelHelper:view type:type title:title subtitle:subtitle hideAfter:interval]; } +(void) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval { - MKInfoPanel *panel = [MKInfoPanel infoPanel]; - [panel setType:type]; - panel.titleLabel.text = title; - if(subtitle) - { - panel.detailLabel.text = subtitle; - } - else - { - panel.detailLabel.hidden = YES; - panel.frame = CGRectMake(0, 20, 320, 50); - panel.thumbImage.frame = CGRectMake(15, 5, 35, 35); - panel.titleLabel.frame = CGRectMake(57, 12, 240, 21); - - } + MKInfoPanel *panel = [self showPanelHelper:window type:type title:title subtitle:subtitle hideAfter:interval]; - [window addSubview:panel]; - [panel performSelector:@selector(hidePanel) withObject:window afterDelay:interval]; + if (![UIApplication sharedApplication].statusBarHidden) { + CGRect frame = panel.frame; + frame.origin.y += [UIApplication sharedApplication].statusBarFrame.size.height; + panel.frame = frame; + } } -(void) hidePanel From e9b08182b794542b8a9ced8def8938cae8be39e8 Mon Sep 17 00:00:00 2001 From: asarazan Date: Fri, 17 Jun 2011 12:02:24 -0700 Subject: [PATCH 2/7] more concise duplication removal --- MKInfoBundle/MKInfoPanel.h | 4 ++-- MKInfoBundle/MKInfoPanel.m | 16 ++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/MKInfoBundle/MKInfoPanel.h b/MKInfoBundle/MKInfoPanel.h index 7736db0..76616db 100644 --- a/MKInfoBundle/MKInfoPanel.h +++ b/MKInfoBundle/MKInfoPanel.h @@ -40,8 +40,8 @@ typedef enum MKInfoPanelType_ @property (nonatomic, assign) IBOutlet UIImageView *thumbImage; @property (nonatomic, assign) IBOutlet UIImageView *backgroundGradient; -+(void) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; ++(MKInfoPanel*) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; -+(void) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; ++(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; @end diff --git a/MKInfoBundle/MKInfoPanel.m b/MKInfoBundle/MKInfoPanel.m index 4266f65..383b1ee 100644 --- a/MKInfoBundle/MKInfoPanel.m +++ b/MKInfoBundle/MKInfoPanel.m @@ -70,7 +70,6 @@ +(MKInfoPanel*) infoPanel MKInfoPanel *panel = (MKInfoPanel*) [[[UINib nibWithNibName:@"MKInfoPanel" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0]; - CATransition *transition = [CATransition animation]; transition.duration = 0.25; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; @@ -81,8 +80,8 @@ +(MKInfoPanel*) infoPanel return panel; } -+(MKInfoPanel*) showPanelHelper:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval -{ ++(MKInfoPanel*) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval +{ MKInfoPanel *panel = [MKInfoPanel infoPanel]; [panel setType:type]; panel.titleLabel.text = title; @@ -105,20 +104,17 @@ +(MKInfoPanel*) showPanelHelper:(UIView*) view type:(MKInfoPanelType) type title return panel; } -+(void) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval -{ - MKInfoPanel *panel = [self showPanelHelper:view type:type title:title subtitle:subtitle hideAfter:interval]; -} - -+(void) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval ++(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval { - MKInfoPanel *panel = [self showPanelHelper:window type:type title:title subtitle:subtitle hideAfter:interval]; + MKInfoPanel *panel = [self showPanelInView:window type:type title:title subtitle:subtitle hideAfter:interval]; if (![UIApplication sharedApplication].statusBarHidden) { CGRect frame = panel.frame; frame.origin.y += [UIApplication sharedApplication].statusBarFrame.size.height; panel.frame = frame; } + + return panel; } -(void) hidePanel From c665f6b2a87b10efeff0783e6d2e66674f390374 Mon Sep 17 00:00:00 2001 From: asarazan Date: Fri, 17 Jun 2011 12:12:37 -0700 Subject: [PATCH 3/7] added hide-on-touch --- MKInfoBundle/MKInfoPanel.h | 3 +++ MKInfoBundle/MKInfoPanel.m | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/MKInfoBundle/MKInfoPanel.h b/MKInfoBundle/MKInfoPanel.h index 76616db..f55a979 100644 --- a/MKInfoBundle/MKInfoPanel.h +++ b/MKInfoBundle/MKInfoPanel.h @@ -33,12 +33,15 @@ typedef enum MKInfoPanelType_ UIImageView *_thumbImage; UIImageView *_backgroundGradient; + + SEL _onTouched; } @property (nonatomic, assign) IBOutlet UILabel *titleLabel; @property (nonatomic, assign) IBOutlet UILabel *detailLabel; @property (nonatomic, assign) IBOutlet UIImageView *thumbImage; @property (nonatomic, assign) IBOutlet UIImageView *backgroundGradient; +@property (nonatomic, assign) SEL onTouched; +(MKInfoPanel*) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; diff --git a/MKInfoBundle/MKInfoPanel.m b/MKInfoBundle/MKInfoPanel.m index 383b1ee..3615fc4 100644 --- a/MKInfoBundle/MKInfoPanel.m +++ b/MKInfoBundle/MKInfoPanel.m @@ -34,12 +34,25 @@ @implementation MKInfoPanel @synthesize detailLabel = _detailLabel; @synthesize thumbImage = _thumbImage; @synthesize backgroundGradient = _backgroundGradient; +@synthesize onTouched = _onTouched; + +- (void)setup { + self.onTouched = @selector(hidePanel); +} - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - // Initialization code + [self setup]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setup]; } return self; } @@ -130,6 +143,10 @@ -(void) hidePanel [self performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.25]; } +-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + [self performSelector:_onTouched]; +} + - (void)dealloc { [super dealloc]; From bafbc92070218551653017fc7824c6c564506e92 Mon Sep 17 00:00:00 2001 From: asarazan Date: Fri, 17 Jun 2011 13:00:18 -0700 Subject: [PATCH 4/7] added an onFinished handler --- MKInfoBundle/MKInfoPanel.h | 5 +++++ MKInfoBundle/MKInfoPanel.m | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/MKInfoBundle/MKInfoPanel.h b/MKInfoBundle/MKInfoPanel.h index f55a979..78b8653 100644 --- a/MKInfoBundle/MKInfoPanel.h +++ b/MKInfoBundle/MKInfoPanel.h @@ -35,6 +35,9 @@ typedef enum MKInfoPanelType_ UIImageView *_backgroundGradient; SEL _onTouched; + + id _delegate; + SEL _onFinished; } @property (nonatomic, assign) IBOutlet UILabel *titleLabel; @@ -42,6 +45,8 @@ typedef enum MKInfoPanelType_ @property (nonatomic, assign) IBOutlet UIImageView *thumbImage; @property (nonatomic, assign) IBOutlet UIImageView *backgroundGradient; @property (nonatomic, assign) SEL onTouched; +@property (nonatomic, retain) id delegate; +@property (nonatomic, assign) SEL onFinished; +(MKInfoPanel*) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; diff --git a/MKInfoBundle/MKInfoPanel.m b/MKInfoBundle/MKInfoPanel.m index 3615fc4..32590aa 100644 --- a/MKInfoBundle/MKInfoPanel.m +++ b/MKInfoBundle/MKInfoPanel.m @@ -35,6 +35,8 @@ @implementation MKInfoPanel @synthesize thumbImage = _thumbImage; @synthesize backgroundGradient = _backgroundGradient; @synthesize onTouched = _onTouched; +@synthesize delegate = _delegate; +@synthesize onFinished = _onFinished; - (void)setup { self.onTouched = @selector(hidePanel); @@ -132,6 +134,8 @@ +(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type -(void) hidePanel { + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + CATransition *transition = [CATransition animation]; transition.duration = 0.25; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; @@ -149,6 +153,8 @@ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { - (void)dealloc { + [_delegate performSelector:_onFinished]; + [_delegate release]; [super dealloc]; } From 21ae7e9121e61f3f4044637c3a3606f50b5e0187 Mon Sep 17 00:00:00 2001 From: Matthias Tretter Date: Fri, 24 Jun 2011 01:19:35 +0200 Subject: [PATCH 5/7] Cleanup, use width of view instead of fixed width of 320 --- MKInfoBundle/MKInfoPanel.h | 9 ++- MKInfoBundle/MKInfoPanel.m | 117 ++++++++++++++++++++++--------------- 2 files changed, 76 insertions(+), 50 deletions(-) diff --git a/MKInfoBundle/MKInfoPanel.h b/MKInfoBundle/MKInfoPanel.h index 78b8653..db3faf0 100644 --- a/MKInfoBundle/MKInfoPanel.h +++ b/MKInfoBundle/MKInfoPanel.h @@ -20,8 +20,7 @@ #import #define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a] -typedef enum MKInfoPanelType_ -{ +typedef enum { MKInfoPanelTypeInfo, MKInfoPanelTypeError } MKInfoPanelType; @@ -38,6 +37,8 @@ typedef enum MKInfoPanelType_ id _delegate; SEL _onFinished; + + MKInfoPanelType type_; } @property (nonatomic, assign) IBOutlet UILabel *titleLabel; @@ -45,11 +46,13 @@ typedef enum MKInfoPanelType_ @property (nonatomic, assign) IBOutlet UIImageView *thumbImage; @property (nonatomic, assign) IBOutlet UIImageView *backgroundGradient; @property (nonatomic, assign) SEL onTouched; -@property (nonatomic, retain) id delegate; +@property (nonatomic, assign) id delegate; @property (nonatomic, assign) SEL onFinished; +(MKInfoPanel*) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; +(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; +-(void) hidePanel; + @end diff --git a/MKInfoBundle/MKInfoPanel.m b/MKInfoBundle/MKInfoPanel.m index 32590aa..862f3b5 100644 --- a/MKInfoBundle/MKInfoPanel.m +++ b/MKInfoBundle/MKInfoPanel.m @@ -21,15 +21,20 @@ #import // Private Methods -// this should be added before implementation block -@interface MKInfoPanel (PrivateMethods) +@interface MKInfoPanel () + @property (nonatomic, assign) MKInfoPanelType type; + + (MKInfoPanel*) infoPanel; + +- (void)setup; + @end @implementation MKInfoPanel + @synthesize titleLabel = _titleLabel; @synthesize detailLabel = _detailLabel; @synthesize thumbImage = _thumbImage; @@ -37,13 +42,15 @@ @implementation MKInfoPanel @synthesize onTouched = _onTouched; @synthesize delegate = _delegate; @synthesize onFinished = _onFinished; +@synthesize type = type_; -- (void)setup { - self.onTouched = @selector(hidePanel); -} -- (id)initWithFrame:(CGRect)frame -{ +//////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Lifecycle +//////////////////////////////////////////////////////////////////////// + +- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setup]; @@ -59,58 +66,54 @@ - (id)initWithCoder:(NSCoder *)aDecoder { return self; } --(void) setType:(MKInfoPanelType)type -{ - if(type == MKInfoPanelTypeError) - { +- (void)dealloc { + [_delegate performSelector:_onFinished]; + + [super dealloc]; +} + +//////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Setter/Getter +//////////////////////////////////////////////////////////////////////// + +-(void) setType:(MKInfoPanelType)type { + if(type == MKInfoPanelTypeError) { self.backgroundGradient.image = [[UIImage imageNamed:@"Red"] stretchableImageWithLeftCapWidth:1 topCapHeight:5]; self.titleLabel.font = [UIFont boldSystemFontOfSize:14]; self.detailLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14]; self.thumbImage.image = [UIImage imageNamed:@"Warning"]; self.detailLabel.textColor = RGBA(255, 140, 140, 0.6); - } - else if(type == MKInfoPanelTypeInfo) - { + + else if(type == MKInfoPanelTypeInfo) { self.backgroundGradient.image = [[UIImage imageNamed:@"Blue"] stretchableImageWithLeftCapWidth:1 topCapHeight:5]; self.titleLabel.font = [UIFont boldSystemFontOfSize:15]; self.thumbImage.image = [UIImage imageNamed:@"Tick"]; self.detailLabel.textColor = RGBA(210, 210, 235, 1.0); } - } -+(MKInfoPanel*) infoPanel -{ - MKInfoPanel *panel = (MKInfoPanel*) [[[UINib nibWithNibName:@"MKInfoPanel" bundle:nil] - instantiateWithOwner:self options:nil] objectAtIndex:0]; - CATransition *transition = [CATransition animation]; - transition.duration = 0.25; - transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; - transition.type = kCATransitionPush; - transition.subtype = kCATransitionFromBottom; - [panel.layer addAnimation:transition forKey:nil]; - - return panel; -} +//////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Show/Hide +//////////////////////////////////////////////////////////////////////// -+(MKInfoPanel*) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval -{ ++(MKInfoPanel*) showPanelInView:(UIView*)view type:(MKInfoPanelType)type title:(NSString*)title subtitle:(NSString*)subtitle hideAfter:(NSTimeInterval)interval { MKInfoPanel *panel = [MKInfoPanel infoPanel]; - [panel setType:type]; + + panel.type = type; panel.titleLabel.text = title; - if(subtitle) - { + + if(subtitle) { panel.detailLabel.text = subtitle; - } - else - { + panel.frame = CGRectMake(0, 0, view.bounds.size.width, panel.frame.size.height); + } else { panel.detailLabel.hidden = YES; - panel.frame = CGRectMake(0, 0, 320, 50); + panel.frame = CGRectMake(0, 0, view.bounds.size.width, 50); panel.thumbImage.frame = CGRectMake(15, 5, 35, 35); panel.titleLabel.frame = CGRectMake(57, 12, 240, 21); - } [view addSubview:panel]; @@ -119,8 +122,7 @@ +(MKInfoPanel*) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title return panel; } -+(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval -{ ++(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval { MKInfoPanel *panel = [self showPanelInView:window type:type title:title subtitle:subtitle hideAfter:interval]; if (![UIApplication sharedApplication].statusBarHidden) { @@ -132,8 +134,7 @@ +(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type return panel; } --(void) hidePanel -{ +-(void) hidePanel { [NSObject cancelPreviousPerformRequestsWithTarget:self]; CATransition *transition = [CATransition animation]; @@ -147,15 +148,37 @@ -(void) hidePanel [self performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.25]; } +//////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Touch Recognition +//////////////////////////////////////////////////////////////////////// + -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self performSelector:_onTouched]; } -- (void)dealloc -{ - [_delegate performSelector:_onFinished]; - [_delegate release]; - [super dealloc]; +//////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Private +//////////////////////////////////////////////////////////////////////// + ++(MKInfoPanel*) infoPanel { + MKInfoPanel *panel = (MKInfoPanel*) [[[UINib nibWithNibName:@"MKInfoPanel" bundle:nil] + instantiateWithOwner:self options:nil] objectAtIndex:0]; + + CATransition *transition = [CATransition animation]; + transition.duration = 0.25; + transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + transition.type = kCATransitionPush; + transition.subtype = kCATransitionFromBottom; + [panel.layer addAnimation:transition forKey:nil]; + + return panel; +} + +- (void)setup { + self.onTouched = @selector(hidePanel); + self.autoresizingMask = UIViewAutoresizingFlexibleWidth; } @end From d38b6a8a9bd2545970c929e50e92d559e2870f79 Mon Sep 17 00:00:00 2001 From: Matthias Tretter Date: Fri, 24 Jun 2011 01:27:33 +0200 Subject: [PATCH 6/7] Added methods to show permanently, don't shrink to width 320 when hiding --- MKInfoBundle/MKInfoPanel.h | 8 +++++--- MKInfoBundle/MKInfoPanel.m | 25 ++++++++++++++++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/MKInfoBundle/MKInfoPanel.h b/MKInfoBundle/MKInfoPanel.h index db3faf0..99bca8c 100644 --- a/MKInfoBundle/MKInfoPanel.h +++ b/MKInfoBundle/MKInfoPanel.h @@ -49,10 +49,12 @@ typedef enum { @property (nonatomic, assign) id delegate; @property (nonatomic, assign) SEL onFinished; -+(MKInfoPanel*) showPanelInView:(UIView*) view type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; ++ (MKInfoPanel *)showPanelInView:(UIView*)view type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle; ++ (MKInfoPanel *)showPanelInView:(UIView*)view type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle hideAfter:(NSTimeInterval)interval; -+(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval; ++ (MKInfoPanel *)showPanelInWindow:(UIWindow*)window type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle; ++ (MKInfoPanel *)showPanelInWindow:(UIWindow*)window type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle hideAfter:(NSTimeInterval)interval; --(void) hidePanel; +- (void)hidePanel; @end diff --git a/MKInfoBundle/MKInfoPanel.m b/MKInfoBundle/MKInfoPanel.m index 862f3b5..3a1c09c 100644 --- a/MKInfoBundle/MKInfoPanel.m +++ b/MKInfoBundle/MKInfoPanel.m @@ -77,7 +77,7 @@ - (void)dealloc { #pragma mark Setter/Getter //////////////////////////////////////////////////////////////////////// --(void) setType:(MKInfoPanelType)type { +-(void)setType:(MKInfoPanelType)type { if(type == MKInfoPanelTypeError) { self.backgroundGradient.image = [[UIImage imageNamed:@"Red"] stretchableImageWithLeftCapWidth:1 topCapHeight:5]; self.titleLabel.font = [UIFont boldSystemFontOfSize:14]; @@ -100,7 +100,11 @@ -(void) setType:(MKInfoPanelType)type { #pragma mark Show/Hide //////////////////////////////////////////////////////////////////////// -+(MKInfoPanel*) showPanelInView:(UIView*)view type:(MKInfoPanelType)type title:(NSString*)title subtitle:(NSString*)subtitle hideAfter:(NSTimeInterval)interval { ++ (MKInfoPanel *)showPanelInView:(UIView *)view type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle { + return [self showPanelInView:view type:type title:title subtitle:subtitle hideAfter:-1]; +} + ++(MKInfoPanel *)showPanelInView:(UIView *)view type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle hideAfter:(NSTimeInterval)interval { MKInfoPanel *panel = [MKInfoPanel infoPanel]; panel.type = type; @@ -117,12 +121,19 @@ +(MKInfoPanel*) showPanelInView:(UIView*)view type:(MKInfoPanelType)type title:( } [view addSubview:panel]; - [panel performSelector:@selector(hidePanel) withObject:view afterDelay:interval]; + + if (interval > 0) { + [panel performSelector:@selector(hidePanel) withObject:view afterDelay:interval]; + } return panel; } -+(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type title:(NSString*) title subtitle:(NSString*) subtitle hideAfter:(NSTimeInterval) interval { ++ (MKInfoPanel *)showPanelInWindow:(UIWindow *)window type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle { + return [self showPanelInWindow:window type:type title:title subtitle:subtitle hideAfter:-1]; +} + ++(MKInfoPanel *)showPanelInWindow:(UIWindow *)window type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle hideAfter:(NSTimeInterval)interval { MKInfoPanel *panel = [self showPanelInView:window type:type title:title subtitle:subtitle hideAfter:interval]; if (![UIApplication sharedApplication].statusBarHidden) { @@ -134,7 +145,7 @@ +(MKInfoPanel*) showPanelInWindow:(UIWindow*) window type:(MKInfoPanelType) type return panel; } --(void) hidePanel { +-(void)hidePanel { [NSObject cancelPreviousPerformRequestsWithTarget:self]; CATransition *transition = [CATransition animation]; @@ -143,7 +154,7 @@ -(void) hidePanel { transition.type = kCATransitionPush; transition.subtype = kCATransitionFromTop; [self.layer addAnimation:transition forKey:nil]; - self.frame = CGRectMake(0, -self.frame.size.height, 320, self.frame.size.height); + self.frame = CGRectMake(0, -self.frame.size.height, self.frame.size.width, self.frame.size.height); [self performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.25]; } @@ -162,7 +173,7 @@ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { #pragma mark Private //////////////////////////////////////////////////////////////////////// -+(MKInfoPanel*) infoPanel { ++(MKInfoPanel *)infoPanel { MKInfoPanel *panel = (MKInfoPanel*) [[[UINib nibWithNibName:@"MKInfoPanel" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0]; From 5a1da715f091a1bdc89ff067b54d68ca65fc9cad Mon Sep 17 00:00:00 2001 From: Matthias Tretter Date: Sun, 26 Jun 2011 16:13:09 +0200 Subject: [PATCH 7/7] Made MKInfoPanel more look like the original, update height of MKInfoPanel according to content --- MKInfoBundle/MKInfoPanel.m | 11 ++++-- MKInfoBundle/MKInfoPanel.xib | 72 +++++++++++++++++++++-------------- MKInfoBundle/Tick.png | Bin 9958 -> 1868 bytes MKInfoBundle/Tick@2x.png | Bin 11963 -> 2356 bytes MKInfoBundle/Warning.png | Bin 5016 -> 3020 bytes MKInfoBundle/Warning@2x.png | Bin 8082 -> 5200 bytes 6 files changed, 51 insertions(+), 32 deletions(-) diff --git a/MKInfoBundle/MKInfoPanel.m b/MKInfoBundle/MKInfoPanel.m index 3a1c09c..f280b92 100644 --- a/MKInfoBundle/MKInfoPanel.m +++ b/MKInfoBundle/MKInfoPanel.m @@ -84,7 +84,7 @@ -(void)setType:(MKInfoPanelType)type { self.detailLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14]; self.thumbImage.image = [UIImage imageNamed:@"Warning"]; - self.detailLabel.textColor = RGBA(255, 140, 140, 0.6); + self.detailLabel.textColor = [UIColor colorWithRed:1.f green:0.651f blue:0.651f alpha:1.f]; } else if(type == MKInfoPanelTypeInfo) { @@ -106,20 +106,25 @@ + (MKInfoPanel *)showPanelInView:(UIView *)view type:(MKInfoPanelType)type title +(MKInfoPanel *)showPanelInView:(UIView *)view type:(MKInfoPanelType)type title:(NSString *)title subtitle:(NSString *)subtitle hideAfter:(NSTimeInterval)interval { MKInfoPanel *panel = [MKInfoPanel infoPanel]; + CGFloat panelHeight = 50; // panel height when no subtitle set panel.type = type; panel.titleLabel.text = title; if(subtitle) { panel.detailLabel.text = subtitle; - panel.frame = CGRectMake(0, 0, view.bounds.size.width, panel.frame.size.height); + [panel.detailLabel sizeToFit]; + + panelHeight = MAX(CGRectGetMaxY(panel.thumbImage.frame), CGRectGetMaxY(panel.detailLabel.frame)); + panelHeight += 10.f; // padding at bottom } else { panel.detailLabel.hidden = YES; - panel.frame = CGRectMake(0, 0, view.bounds.size.width, 50); panel.thumbImage.frame = CGRectMake(15, 5, 35, 35); panel.titleLabel.frame = CGRectMake(57, 12, 240, 21); } + // update frame of panel + panel.frame = CGRectMake(0, 0, view.bounds.size.width, panelHeight); [view addSubview:panel]; if (interval > 0) { diff --git a/MKInfoBundle/MKInfoPanel.xib b/MKInfoBundle/MKInfoPanel.xib index d1e6c9d..14f4094 100644 --- a/MKInfoBundle/MKInfoPanel.xib +++ b/MKInfoBundle/MKInfoPanel.xib @@ -1,14 +1,14 @@ - 1056 + 1280 10J869 - 1306 + 1864 1038.35 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 301 + 865 YES @@ -22,11 +22,8 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin - YES - - YES - - + PluginDependencyRecalculationVersion + YES @@ -46,7 +43,7 @@ 274 - {320, 70} + {320, 66} @@ -60,7 +57,7 @@ 292 - {{72, 5}, {240, 21}} + {{57, 4}, {240, 21}} @@ -70,11 +67,6 @@ NO IBCocoaTouchFramework Network Failure - - Helvetica-Bold - 15 - 16 - 3 MQA @@ -86,13 +78,25 @@ 1 10 + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + 292 - {{72, 22}, {240, 43}} + {{57, 25}, {251, 32}} + NO YES @@ -100,11 +104,6 @@ NO IBCocoaTouchFramework Check your internet connection and try again later - - HelveticaNeue - 14 - 16 - 1 MSAwLjU0OTAxOTYwNzggMC41NDkwMTk2MDc4IDAuNgA @@ -113,12 +112,23 @@ 1 NO 10 - 2 + 0 + + HelveticaNeue + Helvetica Neue + 0 + 14 + + + HelveticaNeue-Medium + 14 + 16 + 256 - {{15, 10}, {50, 50}} + {{12, 8}, {37, 34}} @@ -126,7 +136,7 @@ IBCocoaTouchFramework - {320, 70} + {320, 66} @@ -179,7 +189,9 @@ YES 0 - + + YES + @@ -189,9 +201,9 @@ YES - + @@ -232,9 +244,10 @@ YES YES + -1.IBPluginDependency -2.CustomClassName + -2.IBPluginDependency 1.CustomClassName - 1.IBEditorWindowLastContentRect 1.IBPluginDependency 3.IBPluginDependency 4.IBPluginDependency @@ -243,9 +256,10 @@ YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin MKInfoPanel - {{354, 412}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -334,6 +348,6 @@ YES 3 - 301 + 865 diff --git a/MKInfoBundle/Tick.png b/MKInfoBundle/Tick.png index 1fcb2cab2d7f518e1c1a4ecb707f5e09f3f0b462..1068a8b70beb458a0cb351bf1e3abe29118d9e42 100644 GIT binary patch literal 1868 zcmai#2~ZPf6vqRo2#N}#pfeqJBD4WXvKvBfCWMz6J#+V79HZkt}GY?f!Tvfdeh3I;b6pP))zSvP-6%}12dTk2?>k@R|c+C zFd;slZ?wT;(Mf`?OH>o6p03tyoU?#nI+<3fA(XfpFj_>VcswDXl97H`f=V-QR;`;& z6PYlk9@Q`*254N;3@De)bDDT<+>CR%jETizDojo2NEVuB$t+1E^Z0^hRjPSfM+9RZ z*R~+73r*Bu%wSB1$7^L6iElK9rGdp-3?*=FD2~U?WjrtjCvaU1t^vd$Zh!=pDb>dD zCp?Cr1SX)8*@x($D;)wuSuB{vhuwH|kVn?w11iDg%IL&@p-?Eqf!XBwPn0aZ93{~I zh2=6h8rP~&GXF{ys=$~UwPMDbL<0M%bp)!GVSb2!N-m9|RLWs*K3fDKUSc*IbcG;q zkk99`cs^_~PXzHn9^y8qMQ~ZXu?llq`A04CpIYO7Hr5G7Fs*VQCil_eDqyA-uyTP| z+}JFZE63Z5?J7nVj^%?^zCbLqTJe8snPf0b-qx6VzGEns||?>%xb-@TZcY*{VY zn~C*38_1Ri{18!SM9bLS?Y=#zz4^rWi{6yNOP&rTqB74q=@oH)dF+8H^XE1^+fCP9 ztm1A&N+awx9Up8otO%0Ezvz~Rp2`({))BwL-wCcOb-?JUTRHv5#)gY43@Y^=?84C7 zrim1NQT|Z!?w?u9JIW@@Q`fW_)>AB~1K0uS(}CXp{)`_S9j&ulC%-@3_NViag6v+w z-8*%4kuR%hH2vl`wdYX}`)TXrLz&?jyG_4{y3;e=Y$sTUPHhpU`K75HuUbS6m>Z;h z+tnsBq`?jJt^Kb&FO*Y}LqjcevvZcSZ_Q-=`nWtTkIV zly=(dy!XwX{oP-s){Qz^CwElrH#F8)HgzQpJzO1W+UQ?fty}))T~bJMw2=D~)I}31 z{LO6Aik98(eA`kXS{Kw)d}w>}-mYDXL}u$(R&}=x@N1NTzn*JfKHPJ#PjT#;R+5+s z2kyAVE*~mjmTYoKd&p}D%Q5W=3VRSZYCqvQ;#gX89|&VB7F}vTByTv~w;kD_+f!sX z8{0Jc;KAN^e>_f4v2=(zv-Yvj#S~c+wj=V1QKfoKoNKzZx4&w{U^De}syMTyc9-m= zU7l0ObMBb)`1?1i{hn-T_kgVnt5Ut|;>bXLE`GbRGtUHR<|tkjZ=;z}3gaJHg#T6* zY*}hsLyO2sWA6|ut~z*FI0V<+2r5_|)0FM8Y;AzaR!SC6XbLQK5=N||6@D8hP^&6(t;wBe1cQXv==qxmWy{P4Ck^(Ldz}0tt$Ak4*FDXM zNy)y3+LGU&i9D?rr@VX8Zt(HW^6hn&zdn=WtjR0(wn{WKnto$-)tnkU`B#&>^Rc%Z0zFMKYD!oGvVcnCPteah0IBwhO8Xm| Cna}G0 literal 9958 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 a10gv1*Y3l=NDFS#iS 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 literal 8082 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