Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 804 → Rev 805

/iKopter/trunk/Classes/three20/TTActivityLabel.m
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