blob: c6b8486026f8d9efbd4bfc9c09c4588655a22626 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 "WXIndicatorComponent.h"
#import "WXConvert.h"
#import "WXSDKInstance.h"
#import "WXUtility.h"
@implementation WXIndicatorView
@synthesize pointCount = _pointCount;
@synthesize currentPoint = _currentPoint;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.pointSpace = 5.0f;
}
return self;
}
- (void)setBackgroundColor:(UIColor *)backgroundColor
{
[super setBackgroundColor:backgroundColor];
}
- (void)setPointCount:(NSInteger)pointCount
{
_pointCount = pointCount;
WXPerformBlockOnMainThread(^{
[self setNeedsDisplay];
});
}
- (void)setCurrentPoint:(NSInteger)currentPoint
{
if (currentPoint < _pointCount && currentPoint >= 0) {
_currentPoint = currentPoint;
WXPerformBlockOnMainThread(^{
[self setNeedsDisplay];
});
}
}
- (void)setPointSize:(CGFloat)pointSize
{
_pointSize = pointSize;
WXPerformBlockOnMainThread(^{
[self setNeedsDisplay];
});
}
- (void)setPointSpace:(CGFloat)pointSpace
{
_pointSpace = pointSpace;
WXPerformBlockOnMainThread(^{
[self setNeedsDisplay];
});
}
- (void)drawRect:(CGRect)rect
{
if (self.alignStyle == WXPointIndicatorAlignCenter) {
CGFloat startX = 0.0f, centerX = self.frame.size.width / 2.0f;
if (self.pointCount % 2) {
startX = centerX - (self.pointSize + self.pointSpace) * (int)(self.pointCount / 2.0f) - self.pointSize / 2.0f;
} else {
startX = centerX - (self.pointSize + self.pointSpace) * (int)(self.pointCount / 2.0f) + self.pointSpace / 2.0f;
}
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextBeginPath(context);
for (int i = 0; i < self.pointCount; i++) {
if (self.currentPoint == i) {
CGContextSetFillColorWithColor(context, self.lightColor.CGColor);
CGContextAddEllipseInRect(context, CGRectMake(startX, (self.frame.size.height - self.pointSize) / 2.0f, self.pointSize, self.pointSize));
CGContextFillPath(context);
} else {
CGContextSetFillColorWithColor(context, self.pointColor.CGColor);
CGContextAddEllipseInRect(context, CGRectMake(startX, (self.frame.size.height - self.pointSize) / 2.0f, self.pointSize, self.pointSize));
CGContextFillPath(context);
}
startX += self.pointSize + self.pointSpace;
}
} else if (self.alignStyle == WXPointIndicatorAlignRight) {
CGFloat startX = self.frame.size.width - self.pointSize * self.pointCount - self.pointSpace * (self.pointCount - 1) - 10; //10 right margin
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextBeginPath(context);
for(int i = 0; i < self.pointCount; i++) {
if (self.currentPoint == i) {
CGContextSetFillColorWithColor(context, self.lightColor.CGColor);
CGContextAddEllipseInRect(context, CGRectMake(startX, (self.frame.size.height - self.pointSize) / 2.0f, self.pointSize, self.pointSize));
CGContextFillPath(context);
} else {
CGContextSetFillColorWithColor(context, self.pointColor.CGColor);
CGContextAddEllipseInRect(context, CGRectMake(startX, (self.frame.size.height - self.pointSize) / 2.0f, self.pointSize, self.pointSize));
CGContextFillPath(context);
}
startX += self.pointSize + self.pointSpace;
}
} else if (self.alignStyle == WXPointIndicatorAlignLeft) {
CGFloat startX = 10.0f; //10 left margin
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextBeginPath(context);
for(int i = 0; i < self.pointCount; i++) {
if (self.currentPoint == i) {
CGContextSetFillColorWithColor(context, self.lightColor.CGColor);
CGContextAddEllipseInRect(context, CGRectMake(startX, (self.frame.size.height - self.pointSize) / 2.0f, self.pointSize, self.pointSize));
CGContextFillPath(context);
} else {
CGContextSetFillColorWithColor(context, self.pointColor.CGColor);
CGContextAddEllipseInRect(context, CGRectMake(startX, (self.frame.size.height - self.pointSize) / 2.0f, self.pointSize, self.pointSize));
CGContextFillPath(context);
}
startX += self.pointSize + self.pointSpace;
}
}
}
@end
@interface WXIndicatorComponent()
@property (nonatomic, strong) WXIndicatorView *indicatorView;
@property (nonatomic, strong) UIColor *itemColor;
@property (nonatomic, strong) UIColor *itemSelectedColor;
@property (nonatomic) CGFloat itemSize;
@end
@implementation WXIndicatorComponent
- (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
{
if (self = [super initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:weexInstance]) {
_itemColor = styles[@"itemColor"] ? [WXConvert UIColor:styles[@"itemColor"]]:[UIColor colorWithRed:0xff/255.0f green:0xff/255.0f blue:0xff/255.0f alpha:0.5f];
_itemSelectedColor = styles[@"itemSelectedColor"] ? [WXConvert UIColor:styles[@"itemSelectedColor"]]:[UIColor colorWithRed:0xff/255.0f green:0xd5/255.0f blue:0x45/255.0f alpha:1.0f];
_itemSize = styles[@"itemSize"] ? [WXConvert WXPixelType:styles[@"itemSize"] scaleFactor:self.weexInstance.pixelScaleFactor] : 5.0f;
}
return self;
}
- (UIView *)loadView
{
return [[WXIndicatorView alloc] init];
}
- (void)viewDidLoad
{
[super viewDidLoad];
_indicatorView = (WXIndicatorView *)self.view;
_indicatorView.alignStyle = WXPointIndicatorAlignCenter;
_indicatorView.userInteractionEnabled = NO;
_indicatorView.pointColor = _itemColor;
_indicatorView.lightColor = _itemSelectedColor;
_indicatorView.pointSize = _itemSize;
if (self.delegate && [self.delegate respondsToSelector:@selector(setIndicatorView:)]) {
[self.delegate setIndicatorView:_indicatorView];
}
}
- (void)layoutDidFinish
{
if (self.delegate && [self.delegate respondsToSelector:@selector(setIndicatorView:)]) {
[self.delegate setIndicatorView:_indicatorView];
}
}
- (void)updateStyles:(NSDictionary *)styles
{
BOOL styleChange = NO;
if (styles[@"itemColor"]) {
styleChange = YES;
_itemColor = [WXConvert UIColor:styles[@"itemColor"]];
[_indicatorView setPointColor:_itemColor];
}
if (styles[@"itemSelectedColor"]) {
styleChange = YES;
_itemSelectedColor = [WXConvert UIColor:styles[@"itemSelectedColor"]];
[_indicatorView setLightColor:_itemSelectedColor];
}
if (styles[@"itemSize"]) {
styleChange = YES;
_itemSize = [WXConvert WXPixelType:styles[@"itemSize"] scaleFactor:self.weexInstance.pixelScaleFactor];
[_indicatorView setPointSize:_itemSize];
}
if (styleChange) {
WXPerformBlockOnMainThread(^{
[self setNeedsDisplay];
});
}
}
@end