mirror of
https://github.com/danog/Telegram.git
synced 2024-12-05 21:39:04 +01:00
264 lines
7.8 KiB
Objective-C
264 lines
7.8 KiB
Objective-C
/*
|
|
* This is the source code of Telegram for iOS v. 1.1
|
|
* It is licensed under GNU GPL v. 2 or later.
|
|
* You should have received a copy of the license in this archive (see LICENSE).
|
|
*
|
|
* Copyright Peter Iakovlev, 2013.
|
|
*/
|
|
|
|
#import "TGModernButton.h"
|
|
|
|
@interface TGModernButton ()
|
|
{
|
|
bool _animateHighlight;
|
|
|
|
UIColor *_titleColor;
|
|
|
|
UIImageView *_highlightImageView;
|
|
UIView *_highlightBackgroundView;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TGModernButton
|
|
|
|
- (id)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self)
|
|
{
|
|
_modernHighlight = true;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
|
|
{
|
|
if (self.alpha > FLT_EPSILON && !self.hidden)
|
|
{
|
|
CGRect bounds = self.bounds;
|
|
bounds.origin.x -= _extendedEdgeInsets.left;
|
|
bounds.size.width += _extendedEdgeInsets.left + _extendedEdgeInsets.right;
|
|
bounds.origin.y -= _extendedEdgeInsets.top;
|
|
bounds.size.height += _extendedEdgeInsets.top + _extendedEdgeInsets.bottom;
|
|
if (CGRectContainsPoint(bounds, point))
|
|
return self;
|
|
}
|
|
|
|
return [super hitTest:point withEvent:event];
|
|
}
|
|
|
|
- (void)setModernHighlight:(bool)modernHighlight
|
|
{
|
|
_modernHighlight = modernHighlight;
|
|
if (!_modernHighlight)
|
|
self.alpha = 1.0f;
|
|
}
|
|
|
|
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
|
|
{
|
|
_animateHighlight = true;
|
|
[super touchesMoved:touches withEvent:event];
|
|
_animateHighlight = false;
|
|
}
|
|
|
|
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
|
|
{
|
|
_animateHighlight = true;
|
|
[super touchesCancelled:touches withEvent:event];
|
|
_animateHighlight = false;
|
|
}
|
|
|
|
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
|
|
{
|
|
_animateHighlight = true;
|
|
[super touchesEnded:touches withEvent:event];
|
|
_animateHighlight = false;
|
|
}
|
|
|
|
- (void)setHighlightImage:(UIImage *)highlightImage
|
|
{
|
|
_highlightImage = highlightImage;
|
|
|
|
if (_highlightImage != nil && _highlightImageView == nil)
|
|
{
|
|
_highlightImageView = [[UIImageView alloc] init];
|
|
_highlightImageView.alpha = 0.0f;
|
|
[self insertSubview:_highlightImageView belowSubview:self.titleLabel];
|
|
}
|
|
|
|
_highlightImageView.image = _highlightImage;
|
|
if (_stretchHighlightImage)
|
|
_highlightImageView.frame = self.bounds;
|
|
else
|
|
{
|
|
_highlightImageView.frame = CGRectMake(CGFloor((self.bounds.size.width - _highlightImage.size.width) / 2.0f), CGFloor((self.bounds.size.height - _highlightImage.size.height) / 2.0f), _highlightImage.size.width, _highlightImage.size.height);
|
|
}
|
|
}
|
|
|
|
- (void)setHighlightBackgroundColor:(UIColor *)highlightBackgroundColor
|
|
{
|
|
_highlightBackgroundColor = highlightBackgroundColor;
|
|
|
|
if (_highlightBackgroundColor != nil && _highlightBackgroundView == nil)
|
|
{
|
|
_highlightBackgroundView = [[UIView alloc] init];
|
|
_highlightBackgroundView.alpha = 0.0f;
|
|
[self insertSubview:_highlightBackgroundView atIndex:0];
|
|
}
|
|
|
|
_highlightBackgroundView.backgroundColor = _highlightBackgroundColor;
|
|
CGRect frame = self.bounds;
|
|
frame.origin.x -= _backgroundSelectionInsets.left;
|
|
frame.origin.y -= _backgroundSelectionInsets.top;
|
|
frame.size.width += _backgroundSelectionInsets.left + _backgroundSelectionInsets.right;
|
|
frame.size.height += _backgroundSelectionInsets.top + _backgroundSelectionInsets.bottom;
|
|
_highlightBackgroundView.frame = frame;
|
|
}
|
|
|
|
- (void)setFrame:(CGRect)frame
|
|
{
|
|
[super setFrame:frame];
|
|
|
|
if (_highlightImageView != nil)
|
|
{
|
|
if (_stretchHighlightImage)
|
|
_highlightImageView.frame = self.bounds;
|
|
else
|
|
{
|
|
_highlightImageView.frame = CGRectMake(CGFloor((frame.size.width - _highlightImage.size.width) / 2.0f), CGFloor((frame.size.height - _highlightImage.size.height) / 2.0f), _highlightImage.size.width, _highlightImage.size.height);
|
|
}
|
|
}
|
|
|
|
if (_highlightBackgroundView != nil)
|
|
{
|
|
CGRect frame = self.bounds;
|
|
frame.origin.x -= _backgroundSelectionInsets.left;
|
|
frame.origin.y -= _backgroundSelectionInsets.top;
|
|
frame.size.width += _backgroundSelectionInsets.left + _backgroundSelectionInsets.right;
|
|
frame.size.height += _backgroundSelectionInsets.top + _backgroundSelectionInsets.bottom;
|
|
_highlightBackgroundView.frame = frame;
|
|
}
|
|
}
|
|
|
|
- (void)_setHighligtedAnimated:(bool)__unused highlighted animated:(bool)__unused animated
|
|
{
|
|
|
|
}
|
|
|
|
- (void)setHighlighted:(BOOL)highlighted
|
|
{
|
|
[super setHighlighted:highlighted];
|
|
|
|
if (_highlitedChanged && (highlighted || !_animateHighlight))
|
|
_highlitedChanged(highlighted);
|
|
|
|
if (_modernHighlight)
|
|
{
|
|
if (_highlightImage != nil)
|
|
{
|
|
CGFloat alpha = (highlighted ? 1.0f : 0.0f);
|
|
|
|
if (ABS(alpha - _highlightImageView.alpha) > FLT_EPSILON)
|
|
{
|
|
if (_animateHighlight)
|
|
{
|
|
[UIView animateWithDuration:0.2 animations:^
|
|
{
|
|
_highlightImageView.alpha = alpha;
|
|
} completion:^(BOOL finished)
|
|
{
|
|
if (finished && !highlighted && _highlitedChanged)
|
|
_highlitedChanged(highlighted);
|
|
}];
|
|
}
|
|
else
|
|
_highlightImageView.alpha = alpha;
|
|
}
|
|
}
|
|
else if (_highlightBackgroundColor != nil)
|
|
{
|
|
CGFloat alpha = (highlighted ? 1.0f : 0.0f);
|
|
|
|
if (ABS(alpha - _highlightBackgroundView.alpha) > FLT_EPSILON)
|
|
{
|
|
if (_animateHighlight)
|
|
{
|
|
[UIView animateWithDuration:0.2 animations:^
|
|
{
|
|
_highlightBackgroundView.alpha = alpha;
|
|
} completion:^(BOOL finished)
|
|
{
|
|
if (finished && !highlighted && _highlitedChanged)
|
|
_highlitedChanged(highlighted);
|
|
}];
|
|
}
|
|
else
|
|
_highlightBackgroundView.alpha = alpha;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CGFloat alpha = (highlighted ? 0.4f : 1.0f) * (self.enabled ? 1.0f : 0.5f);
|
|
|
|
if (ABS(alpha - self.alpha) > FLT_EPSILON)
|
|
{
|
|
if (_animateHighlight)
|
|
{
|
|
[UIView animateWithDuration:0.2 animations:^
|
|
{
|
|
self.alpha = alpha;
|
|
} completion:^(BOOL finished)
|
|
{
|
|
if (finished && !highlighted && _highlitedChanged)
|
|
_highlitedChanged(highlighted);
|
|
}];
|
|
}
|
|
else
|
|
self.alpha = alpha;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
[self _setHighligtedAnimated:highlighted animated:_animateHighlight && !highlighted];
|
|
}
|
|
}
|
|
|
|
- (void)setTitleColor:(UIColor *)color
|
|
{
|
|
_titleColor = color;
|
|
|
|
if (iosMajorVersion() >= 7)
|
|
[self setTintColor:color];
|
|
else
|
|
[self setTitleColor:color forState:UIControlStateNormal];
|
|
|
|
if (_modernHighlight && _highlightImage == nil && _highlightBackgroundColor == nil)
|
|
{
|
|
CGFloat alpha = (self.highlighted ? 0.4f : 1.0f) * (self.enabled ? 1.0f : 0.5f);
|
|
self.alpha = alpha;
|
|
}
|
|
}
|
|
|
|
- (void)setEnabled:(BOOL)enabled
|
|
{
|
|
[super setEnabled:enabled];
|
|
|
|
if (_modernHighlight && _highlightImage == nil)
|
|
{
|
|
CGFloat alpha = (self.highlighted ? 0.4f : 1.0f) * (self.enabled ? 1.0f : 0.5f);
|
|
self.alpha = alpha;
|
|
}
|
|
}
|
|
|
|
- (void)tintColorDidChange
|
|
{
|
|
[super tintColorDidChange];
|
|
|
|
if (_modernHighlight && _highlightImage == nil)
|
|
[self setTitleColor:self.tintColor forState:UIControlStateNormal];
|
|
}
|
|
|
|
@end
|