As we all know, User interface is a key part for all application. User interface of an application is only way to interact with end user. A better user interface provide better experiences to end user.
In this block, we are going to create a curve at the upper part of a view.
Resultant screen will be look line below image

For drawing a curve on the upper part of a view, we need to do some math works for setting the radius and center on view.
We need 3 things for drawing a curve:
1. Center.
2. Radius
3. Start angle.
4. End angle.
At the initial point we are not having any point and angle.
Suppose, we want to draw a curve on the upper part of view with area w * 100, w is the width of view.
now we have 3 points on the curve
1. view x origin and 100.
2. view center and 0.
3. view width and 100.
so all points are:
initial point - (0, 100)
mid point - (w/2, 0)
end point - (w, 100).
Now we are having three points, so we can draw a triangle using these points
Lets say our triangle is ∆ABC and ø be the angle opposite to side A.
We can calculate distance between all points of triangle AB, BC and CA
Suppose A is the distance between A and B(AB), similarly B is the distance between BC and C is the distance between CA.
suppose r be the radius of circle/arc.
then A/sinø = 2r,
This isn't hard (just drop a perpendicular fromO to A , and use the definition of sin on the similar triangles).
Area of triangle ∆ABC
K = (BCsinø)/2
sinø = 2K/BC
Now
2r = A/(2K/BC)
r = ABC/4K
Draw a perpendicular for A to BC, we will get height of triangle which is 100(curve draw area as we defined initially)
so K = (base * height) / 2;
K = B * h / 2;
so radius r = AC / 2h.
we have calculated radius. lets calculate center
x point of center will be in the mid of the curve area and y point will be radius.
so center c = (w/2, r)
now we are ready for draw a curve on the upper part of a view.
Sub-classing of view is the best option for customization and redrawing.
Create a new class(subclass of UIView) namely CurveView(you can choose any name for a class)
in a CurveView.h file declare the following methods and variables
//----variables
CGFloat radius;
CGPoint centerPoint;
CGFloat curveTopMargin;
//----methods
-(instancetype) initWithFrame:(CGRect)frame withUpperCurveMargin:(CGFloat)topMargin;
also declare a macro for convert angle from degree to radians
#define DEGREES_TO_RADIANS(degrees) ((M_PI * degrees)/ 180)
Switch to CurveView.m file and following code
//method for initialize an instance of CurveView
-(instancetype) initWithFrame:(CGRect)frame withUpperCurveMargin:(CGFloat)topMargin{
self = [super initWithFrame: frame];
if(self){
curveTopMargin = topMargin;
[self calculateRadius];
}
return self;
}
Now add code for calculate center point and radius
#pragma mark - Calculate radius and center
-(void) calculateRadius{
CGFloat a = [self calculateDistance:CGPointMake(0, curveTopMargin) andPoint:CGPointMake(self.frame.size.width/2, 0)];
CGFloat c = [self calculateDistance:CGPointMake(self.frame.size.width, curveTopMargin) andPoint:CGPointMake(self.frame.size.width/2, 0)];
radius = (a * c)/(2*curveTopMargin);
centerPoint = CGPointMake(self.frame.size.width/2, radius);
}
-(CGFloat) calculateDistance:(CGPoint)p1 andPoint:(CGPoint)p2{
CGFloat x =sqrt((pow((p2.x - p1.x), 2)+(pow(p2.y - p1.y, 2))));
return x;
}
And now add drawRect() method for drawing a view with curve
- (void)drawRect:(CGRect)rect {
// Drawing code
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
//-------draw
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor cyanColor].CGColor);
UIBezierPath *curvePath = [UIBezierPath bezierPath];
[curvePath addArcWithCenter:centerPoint radius:radius-1 startAngle:DEGREES_TO_RADIANS(0) endAngle:DEGREES_TO_RADIANS(360) clockwise:YES];
CGPathRef cgPath = CGPathCreateCopy(curvePath.CGPath);
CGContextAddPath(context, cgPath);
CGContextSetLineWidth(context, 1);
CGContextSetShadowWithColor(context, CGSizeMake(0, -1.0), 0.3, [UIColor lightGrayColor].CGColor);
CGContextDrawPath(context, kCGPathEOFillStroke);
CGPathRelease(cgPath);
CGContextRestoreGState(context);
}
Go to controller class and add curve view as a subview
-(void) addCurveView{
CGSize screenSize = [UIScreen mainScreen].bounds.size;
CurveView *topCurveView = [[CurveView alloc] initWithFrame:CGRectMake(0, screenSize.height, screenSize.width, 250) withUpperCurveMargin:60];
topCurveView.backgroundColor = [UIColor clearColor];
[self.view addSubview:topCurveView];
CGRect f = topCurveView.frame;
f.origin.y = screenSize.height - f.size.height;
[UIView animateWithDuration:0.3 animations:^{
topCurveView.frame = f;
}];
}
Run the app, w can see a curve at the upper part.
Click here for Complete project.
In this block, we are going to create a curve at the upper part of a view.
Resultant screen will be look line below image

For drawing a curve on the upper part of a view, we need to do some math works for setting the radius and center on view.
We need 3 things for drawing a curve:
1. Center.
2. Radius
3. Start angle.
4. End angle.
At the initial point we are not having any point and angle.
Suppose, we want to draw a curve on the upper part of view with area w * 100, w is the width of view.
now we have 3 points on the curve
1. view x origin and 100.
2. view center and 0.
3. view width and 100.
so all points are:
initial point - (0, 100)
mid point - (w/2, 0)
end point - (w, 100).
Now we are having three points, so we can draw a triangle using these points
Lets say our triangle is ∆ABC and ø be the angle opposite to side A.
We can calculate distance between all points of triangle AB, BC and CA
Suppose A is the distance between A and B(AB), similarly B is the distance between BC and C is the distance between CA.
suppose r be the radius of circle/arc.
then A/sinø = 2r,
This isn't hard (just drop a perpendicular from
Area of triangle ∆ABC
K = (BCsinø)/2
sinø = 2K/BC
Now
2r = A/(2K/BC)
r = ABC/4K
Draw a perpendicular for A to BC, we will get height of triangle which is 100(curve draw area as we defined initially)
so K = (base * height) / 2;
K = B * h / 2;
so radius r = AC / 2h.
we have calculated radius. lets calculate center
x point of center will be in the mid of the curve area and y point will be radius.
so center c = (w/2, r)
now we are ready for draw a curve on the upper part of a view.
Sub-classing of view is the best option for customization and redrawing.
Create a new class(subclass of UIView) namely CurveView(you can choose any name for a class)
in a CurveView.h file declare the following methods and variables
//----variables
CGFloat radius;
CGPoint centerPoint;
CGFloat curveTopMargin;
//----methods
-(instancetype) initWithFrame:(CGRect)frame withUpperCurveMargin:(CGFloat)topMargin;
also declare a macro for convert angle from degree to radians
#define DEGREES_TO_RADIANS(degrees) ((M_PI * degrees)/ 180)
Switch to CurveView.m file and following code
//method for initialize an instance of CurveView
-(instancetype) initWithFrame:(CGRect)frame withUpperCurveMargin:(CGFloat)topMargin{
self = [super initWithFrame: frame];
if(self){
curveTopMargin = topMargin;
[self calculateRadius];
}
return self;
}
Now add code for calculate center point and radius
#pragma mark - Calculate radius and center
-(void) calculateRadius{
CGFloat a = [self calculateDistance:CGPointMake(0, curveTopMargin) andPoint:CGPointMake(self.frame.size.width/2, 0)];
CGFloat c = [self calculateDistance:CGPointMake(self.frame.size.width, curveTopMargin) andPoint:CGPointMake(self.frame.size.width/2, 0)];
radius = (a * c)/(2*curveTopMargin);
centerPoint = CGPointMake(self.frame.size.width/2, radius);
}
-(CGFloat) calculateDistance:(CGPoint)p1 andPoint:(CGPoint)p2{
CGFloat x =sqrt((pow((p2.x - p1.x), 2)+(pow(p2.y - p1.y, 2))));
return x;
}
And now add drawRect() method for drawing a view with curve
- (void)drawRect:(CGRect)rect {
// Drawing code
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
//-------draw
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor cyanColor].CGColor);
UIBezierPath *curvePath = [UIBezierPath bezierPath];
[curvePath addArcWithCenter:centerPoint radius:radius-1 startAngle:DEGREES_TO_RADIANS(0) endAngle:DEGREES_TO_RADIANS(360) clockwise:YES];
CGPathRef cgPath = CGPathCreateCopy(curvePath.CGPath);
CGContextAddPath(context, cgPath);
CGContextSetLineWidth(context, 1);
CGContextSetShadowWithColor(context, CGSizeMake(0, -1.0), 0.3, [UIColor lightGrayColor].CGColor);
CGContextDrawPath(context, kCGPathEOFillStroke);
CGPathRelease(cgPath);
CGContextRestoreGState(context);
}
Go to controller class and add curve view as a subview
-(void) addCurveView{
CGSize screenSize = [UIScreen mainScreen].bounds.size;
CurveView *topCurveView = [[CurveView alloc] initWithFrame:CGRectMake(0, screenSize.height, screenSize.width, 250) withUpperCurveMargin:60];
topCurveView.backgroundColor = [UIColor clearColor];
[self.view addSubview:topCurveView];
CGRect f = topCurveView.frame;
f.origin.y = screenSize.height - f.size.height;
[UIView animateWithDuration:0.3 animations:^{
topCurveView.frame = f;
}];
}
Run the app, w can see a curve at the upper part.
Click here for Complete project.
No comments:
Post a Comment