0,0 → 1,347 |
// |
// Copyright 2009-2010 Facebook |
// |
// Licensed under the Apache License, Version 2.0 (the "License"); |
// you may not use this file except in compliance with the License. |
// You may obtain a copy of the License at |
// |
// http://www.apache.org/licenses/LICENSE-2.0 |
// |
// Unless required by applicable law or agreed to in writing, software |
// distributed under the License is distributed on an "AS IS" BASIS, |
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
// See the License for the specific language governing permissions and |
// limitations under the License. |
// |
|
#import "Three20UI/TTActivityLabel.h" |
|
// UI |
#import "Three20UI/TTView.h" |
#import "Three20UI/TTButton.h" |
#import "Three20UI/UIViewAdditions.h" |
|
// UINavigator |
#import "Three20UINavigator/TTGlobalNavigatorMetrics.h" |
|
// Style |
#import "Three20Style/TTGlobalStyle.h" |
#import "Three20Style/TTDefaultStyleSheet.h" |
#import "Three20Style/UIFontAdditions.h" |
|
// Core |
#import "Three20Core/TTCorePreprocessorMacros.h" |
|
static CGFloat kMargin = 10; |
static CGFloat kPadding = 15; |
static CGFloat kBannerPadding = 8; |
static CGFloat kSpacing = 6; |
static CGFloat kProgressMargin = 6; |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
@implementation TTActivityLabel |
|
@synthesize style = _style; |
@synthesize progress = _progress; |
@synthesize smoothesProgress = _smoothesProgress; |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (id)initWithFrame:(CGRect)frame style:(TTActivityLabelStyle)style text:(NSString*)text { |
if (self = [super initWithFrame:frame]) { |
_style = style; |
_progress = 0; |
_smoothesProgress = NO; |
_smoothTimer =nil; |
_progressView = nil; |
|
_bezelView = [[TTView alloc] init]; |
if (_style == TTActivityLabelStyleBlackBezel) { |
_bezelView.backgroundColor = [UIColor clearColor]; |
_bezelView.style = TTSTYLE(blackBezel); |
self.backgroundColor = [UIColor clearColor]; |
} else if (_style == TTActivityLabelStyleWhiteBezel) { |
_bezelView.backgroundColor = [UIColor clearColor]; |
_bezelView.style = TTSTYLE(whiteBezel); |
self.backgroundColor = [UIColor clearColor]; |
} else if (_style == TTActivityLabelStyleWhiteBox) { |
_bezelView.backgroundColor = [UIColor clearColor]; |
self.backgroundColor = [UIColor whiteColor]; |
} else if (_style == TTActivityLabelStyleBlackBox) { |
_bezelView.backgroundColor = [UIColor clearColor]; |
self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8]; |
} else if (_style == TTActivityLabelStyleBlackBanner) { |
_bezelView.backgroundColor = [UIColor clearColor]; |
_bezelView.style = TTSTYLE(blackBanner); |
self.backgroundColor = [UIColor clearColor]; |
} else { |
_bezelView.backgroundColor = [UIColor clearColor]; |
self.backgroundColor = [UIColor clearColor]; |
} |
|
self.autoresizingMask = |
UIViewAutoresizingFlexibleWidth | |
UIViewAutoresizingFlexibleHeight; |
|
_label = [[UILabel alloc] init]; |
_label.text = text; |
_label.backgroundColor = [UIColor clearColor]; |
_label.lineBreakMode = UILineBreakModeTailTruncation; |
|
if (_style == TTActivityLabelStyleWhite) { |
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: |
UIActivityIndicatorViewStyleWhite]; |
_label.font = TTSTYLEVAR(activityLabelFont); |
_label.textColor = [UIColor whiteColor]; |
} else if (_style == TTActivityLabelStyleGray |
|| _style == TTActivityLabelStyleWhiteBox |
|| _style == TTActivityLabelStyleWhiteBezel) { |
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: |
UIActivityIndicatorViewStyleGray]; |
_label.font = TTSTYLEVAR(activityLabelFont); |
_label.textColor = TTSTYLEVAR(tableActivityTextColor); |
} else if (_style == TTActivityLabelStyleBlackBezel || _style == TTActivityLabelStyleBlackBox) { |
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: |
UIActivityIndicatorViewStyleWhiteLarge]; |
_activityIndicator.frame = CGRectMake(0, 0, 24, 24); |
_label.font = TTSTYLEVAR(activityLabelFont); |
_label.textColor = [UIColor whiteColor]; |
_label.shadowColor = [UIColor colorWithWhite:0 alpha:0.3]; |
_label.shadowOffset = CGSizeMake(1, 1); |
} else if (_style == TTActivityLabelStyleBlackBanner) { |
_activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: |
UIActivityIndicatorViewStyleWhite]; |
_label.font = TTSTYLEVAR(activityBannerFont); |
_label.textColor = [UIColor whiteColor]; |
_label.shadowColor = [UIColor colorWithWhite:0 alpha:0.3]; |
_label.shadowOffset = CGSizeMake(1, 1); |
} |
|
[self addSubview:_bezelView]; |
[_bezelView addSubview:_activityIndicator]; |
[_bezelView addSubview:_label]; |
[_activityIndicator startAnimating]; |
} |
return self; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (id)initWithFrame:(CGRect)frame style:(TTActivityLabelStyle)style { |
if (self = [self initWithFrame:frame style:style text:nil]) { |
} |
|
return self; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (id)initWithStyle:(TTActivityLabelStyle)style { |
if (self = [self initWithFrame:CGRectZero style:style text:nil]) { |
} |
|
return self; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (id)initWithFrame:(CGRect)frame { |
if (self = [self initWithFrame:frame style:TTActivityLabelStyleWhiteBox text:nil]) { |
} |
|
return self; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (void)dealloc { |
TT_INVALIDATE_TIMER(_smoothTimer); |
TT_RELEASE_SAFELY(_bezelView); |
TT_RELEASE_SAFELY(_progressView); |
TT_RELEASE_SAFELY(_activityIndicator); |
TT_RELEASE_SAFELY(_label); |
[super dealloc]; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
#pragma mark UIView |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (void)layoutSubviews { |
[super layoutSubviews]; |
|
CGSize textSize = [_label.text sizeWithFont:_label.font]; |
|
CGFloat indicatorSize = 0; |
[_activityIndicator sizeToFit]; |
if (_activityIndicator.isAnimating) { |
if (_activityIndicator.height > textSize.height) { |
indicatorSize = textSize.height; |
} else { |
indicatorSize = _activityIndicator.height; |
} |
} |
|
CGFloat contentWidth = indicatorSize + kSpacing + textSize.width; |
CGFloat contentHeight = textSize.height > indicatorSize ? textSize.height : indicatorSize; |
|
if (_progressView) { |
[_progressView sizeToFit]; |
contentHeight += _progressView.height + kSpacing; |
} |
|
CGFloat margin, padding, bezelWidth, bezelHeight; |
if (_style == TTActivityLabelStyleBlackBezel || _style == TTActivityLabelStyleWhiteBezel) { |
margin = kMargin; |
padding = kPadding; |
bezelWidth = contentWidth + padding*2; |
bezelHeight = contentHeight + padding*2; |
} else { |
margin = 0; |
padding = kBannerPadding; |
bezelWidth = self.width; |
bezelHeight = self.height; |
} |
|
CGFloat maxBevelWidth = TTScreenBounds().size.width - margin*2; |
if (bezelWidth > maxBevelWidth) { |
bezelWidth = maxBevelWidth; |
contentWidth = bezelWidth - (kSpacing + indicatorSize); |
} |
|
CGFloat textMaxWidth = (bezelWidth - (indicatorSize + kSpacing)) - padding*2; |
CGFloat textWidth = textSize.width; |
if (textWidth > textMaxWidth) { |
textWidth = textMaxWidth; |
} |
|
_bezelView.frame = CGRectMake(floor(self.width/2 - bezelWidth/2), |
floor(self.height/2 - bezelHeight/2), |
bezelWidth, bezelHeight); |
|
CGFloat y = padding + floor((bezelHeight - padding*2)/2 - contentHeight/2); |
|
if (_progressView) { |
if (_style == TTActivityLabelStyleBlackBanner) { |
y += kBannerPadding/2; |
} |
_progressView.frame = CGRectMake(kProgressMargin, y, |
bezelWidth - kProgressMargin*2, _progressView.height); |
y += _progressView.height + kSpacing-1; |
} |
|
_label.frame = CGRectMake(floor((bezelWidth/2 - contentWidth/2) + indicatorSize + kSpacing), y, |
textWidth, textSize.height); |
|
_activityIndicator.frame = CGRectMake(_label.left - (indicatorSize+kSpacing), y, |
indicatorSize, indicatorSize); |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (CGSize)sizeThatFits:(CGSize)size { |
CGFloat padding; |
if (_style == TTActivityLabelStyleBlackBezel || _style == TTActivityLabelStyleWhiteBezel) { |
padding = kPadding; |
} else { |
padding = kBannerPadding; |
} |
|
CGFloat height = _label.font.ttLineHeight + padding*2; |
if (_progressView) { |
height += _progressView.height + kSpacing; |
} |
|
return CGSizeMake(size.width, height); |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (void)smoothTimer { |
if (_progressView.progress < _progress) { |
_progressView.progress += 0.01; |
} else { |
TT_INVALIDATE_TIMER(_smoothTimer); |
} |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
#pragma mark Public |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (NSString*)text { |
return _label.text; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (void)setText:(NSString*)text { |
_label.text = text; |
[self setNeedsLayout]; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (UIFont*)font { |
return _label.font; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (void)setFont:(UIFont*)font { |
_label.font = font; |
[self setNeedsLayout]; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (BOOL)isAnimating { |
return _activityIndicator.isAnimating; |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (void)setIsAnimating:(BOOL)isAnimating { |
if (isAnimating) { |
[_activityIndicator startAnimating]; |
|
} else { |
[_activityIndicator stopAnimating]; |
} |
} |
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////// |
- (void)setProgress:(float)progress { |
_progress = progress; |
|
if (!_progressView) { |
_progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault]; |
_progressView.progress = 0; |
[_bezelView addSubview:_progressView]; |
[self setNeedsLayout]; |
} |
|
if (_smoothesProgress) { |
if (!_smoothTimer) { |
_smoothTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self |
selector:@selector(smoothTimer) userInfo:nil repeats:YES]; |
} |
} else { |
_progressView.progress = progress; |
} |
} |
|
|
@end |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |