मेरे पास ए UIViewController
। मैं अपने प्रोग्राम प्रोग्राम में से किसी एक दृश्य में एक रेखा कैसे खींच सकता हूं?
मेरे पास ए UIViewController
। मैं अपने प्रोग्राम प्रोग्राम में से किसी एक दृश्य में एक रेखा कैसे खींच सकता हूं?
जवाबों:
दो सामान्य तकनीकें हैं।
का उपयोग कर CAShapeLayer
:
एक बनाएँ UIBezierPath
(निर्देशांक बदलें जो आप चाहते हैं):
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(10.0, 10.0)];
[path addLineToPoint:CGPointMake(100.0, 100.0)];
एक CAShapeLayer
का उपयोग करें कि बनाएँ UIBezierPath
:
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = [path CGPath];
shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
shapeLayer.lineWidth = 3.0;
shapeLayer.fillColor = [[UIColor clearColor] CGColor];
CAShapeLayer
उसे अपने दृश्य की परत में जोड़ें :
[self.view.layer addSublayer:shapeLayer];
Xcode के पिछले संस्करणों में, आपको अपने प्रोजेक्ट के "लिंक बाइनरी विद लाइब्रेरीज़" में मैन्युअल रूप से QuartzCore.framework को जोड़ना होगा और <QuartzCore/QuartzCore.h>
अपनी .m फ़ाइल में हेडर आयात करना होगा , लेकिन यह अब आवश्यक नहीं है (यदि आपके पास "मॉड्यूल सक्षम करें" और "लिंक" है। फ्रेमवर्क स्वचालित रूप से "बिल्ड सेटिंग्स चालू)।
अन्य तरीका उपवर्ग में है UIView
और फिर विधि में CoreGraphics कॉल का उपयोग करें drawRect
:
एक UIView
उपवर्ग बनाएँ और एक को परिभाषित करें drawRect
जो आपकी रेखा खींचता है।
आप इसे कोर ग्राफिक्स के साथ कर सकते हैं:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [[UIColor blueColor] CGColor]);
CGContextSetLineWidth(context, 3.0);
CGContextMoveToPoint(context, 10.0, 10.0);
CGContextAddLineToPoint(context, 100.0, 100.0);
CGContextDrawPath(context, kCGPathStroke);
}
या उपयोग कर रहा है UIKit
:
- (void)drawRect:(CGRect)rect {
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(10.0, 10.0)];
[path addLineToPoint:CGPointMake(100.0, 100.0)];
path.lineWidth = 3;
[[UIColor blueColor] setStroke];
[path stroke];
}
तब आप या तो अपने NIB / स्टोरीबोर्ड या दृश्य के लिए बेस क्लास के रूप में इस व्यू क्लास का उपयोग कर सकते हैं, या आप अपने व्यू कंट्रोलर को प्रोग्रामेटिक रूप से इसे सबव्यू के रूप में जोड़ सकते हैं:
PathView *pathView = [[PathView alloc] initWithFrame:self.view.bounds];
pathView.backgroundColor = [UIColor clearColor];
[self.view addSubview: pathView];
उपरोक्त दोनों दृष्टिकोणों की स्विफ्ट प्रस्तुतियाँ इस प्रकार हैं:
CAShapeLayer
:
// create path
let path = UIBezierPath()
path.move(to: CGPoint(x: 10, y: 10))
path.addLine(to: CGPoint(x: 100, y: 100))
// Create a `CAShapeLayer` that uses that `UIBezierPath`:
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineWidth = 3
// Add that `CAShapeLayer` to your view's layer:
view.layer.addSublayer(shapeLayer)
UIView
उपवर्ग:
class PathView: UIView {
var path: UIBezierPath? { didSet { setNeedsDisplay() } }
var pathColor: UIColor = .blue { didSet { setNeedsDisplay() } }
override func draw(_ rect: CGRect) {
// stroke the path
pathColor.setStroke()
path?.stroke()
}
}
और इसे अपने दृश्य पदानुक्रम में जोड़ें:
let pathView = PathView()
pathView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(pathView)
NSLayoutConstraint.activate([
pathView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
pathView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
pathView.topAnchor.constraint(equalTo: view.topAnchor),
pathView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
pathView.backgroundColor = .clear
let path = UIBezierPath()
path.move(to: CGPoint(x: 10, y: 10))
path.addLine(to: CGPoint(x: 100, y: 100))
path.lineWidth = 3
pathView.path = path
ऊपर, मैं PathView
प्रोग्रामेटिक रूप से जोड़ रहा हूं , लेकिन आप इसे आईबी के माध्यम से भी जोड़ सकते हैं, और बस इसे path
प्रोग्रामेटिक रूप से सेट कर सकते हैं ।
shapeLayer.lineCap = kCALineCapRound;
UIBezierPath
बार-बार कॉल addLineToPoint
/ addLine(to:)
कॉल के साथ भी सिंगल हो सकते हैं। तब आप चुन सकते हैं कि आप पसंद करते हैं shapeLayer.lineJoin = kCALineJoinRound
या kCALineJoinBevel
या kCALineJoinMiter
।
एक UIView बनाएं और इसे अपने दृश्य नियंत्रक के दृश्य के उप-भाग के रूप में जोड़ें। आप इस सबव्यू की ऊंचाई या चौड़ाई को बहुत छोटा होने के लिए संशोधित कर सकते हैं ताकि यह एक लाइन की तरह दिखे। यदि आपको एक विकर्ण रेखा खींचने की आवश्यकता है, तो आप सबवेज़ बदलने वाली संपत्ति को संशोधित कर सकते हैं।
जैसे काली क्षैतिज रेखा खींचना। इसे आपके दृश्य नियंत्रक के कार्यान्वयन के भीतर से बुलाया जाता है
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,0, self.view.frame.size.width, 1)];
lineView.backgroundColor = [UIColor blackColor];
[self.view addSubview:lineView];
स्विफ्ट 3:
let path = UIBezierPath()
path.move(to: CGPoint(x: 10, y: 10))
path.addLine(to: CGPoint(x: 100, y: 100))
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.lineWidth = 3.0
view.layer.addSublayer(shapeLayer)
यहां एक शांत तकनीक है जो आपको उपयोगी लग सकती है: उद्देश्य-सी में उपवर्ग से बचने के लिए ड्राइंग के लिए ब्लॉकों का उपयोग करना
अपनी परियोजना में लेख के सामान्य-उद्देश्य दृश्य उपवर्ग को शामिल करें, फिर यह एक तरह का कोड है जिसे आप अपने व्यू कंट्रोलर में उस रेखा पर एक दृश्य बनाने के लिए रख सकते हैं जो एक रेखा खींचता है:
DrawView* drawableView = [[[DrawView alloc] initWithFrame:CGRectMake(0,0,320,50)] autorelease];
drawableView.drawBlock = ^(UIView* v,CGContextRef context)
{
CGPoint startPoint = CGPointMake(0,v.bounds.size.height-1);
CGPoint endPoint = CGPointMake(v.bounds.size.width,v.bounds.size.height-1);
CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
CGContextSetLineWidth(context, 1);
CGContextMoveToPoint(context, startPoint.x + 0.5, startPoint.y + 0.5);
CGContextAddLineToPoint(context, endPoint.x + 0.5, endPoint.y + 0.5);
CGContextStrokePath(context);
};
[self.view addSubview:drawableView];
आप रेखाओं को खींचने के लिए UIImageView का उपयोग कर सकते हैं।
हालाँकि, यह सब-क्लासिंग को छोड़ देता है। और जैसा कि मैं कोर ग्राफिक्स के लिए थोड़ा इच्छुक हूं अभी भी इसका उपयोग कर सकता हूं। आप इसे बस में डाल सकते हैं -ViewDidLoad
UIGraphicsBeginImageContext(self.view.frame.size);
[self.myImageView.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush);
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), 50, 50);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), 200, 200);
CGContextStrokePath(UIGraphicsGetCurrentContext());
CGContextFlush(UIGraphicsGetCurrentContext());
self.myImageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
रोब के जवाब के अलावा, एक तड़के के लिए, तीसरा दृष्टिकोण एक का उपयोग करना है UIImageView
- इसके साथ कवर - xib का दृश्य। (Xcode 5 में xib पर घसीटे जाने पर डिफ़ॉल्ट UIImageView उपस्थिति)
चीयर्स और +1!
आपको वास्तव में नहीं होना चाहिए, लेकिन अगर किसी कारण से यह आपके लिए समझ में आता है, तो आप एक उपवर्ग बना सकते हैं, DelegateDrawView
उदाहरण के लिए, यह एक प्रतिनिधि लेता है जो एक विधि को लागू करता है जैसे
- (void)delegateDrawView:(DelegateDrawView *)aDelegateDrawView drawRect:(NSRect)dirtyRect
और फिर विधियों में - [DelegateDrawView drawRect:]
आपको अपनी प्रतिनिधि पद्धति को कॉल करना चाहिए।
लेकिन आप अपने कंट्रोलर में व्यू कोड क्यों डालना चाहेंगे।
आप UIView का एक उपवर्ग बनाने से बेहतर हैं, जो इसके दो कोनों के बीच एक रेखा खींचता है, आपके पास यह सेट करने के लिए एक संपत्ति हो सकती है कि कौन सी दो और फिर उस स्थिति को देखें जहां से आप इसे चाहते हैं।
आपके विचार के अंदर आकर्षित करने के लिए बहुत आसान है, @ Mr.ROB ने कहा कि 2 विधि मैंने पहली विधि ली।
बस उस कोड को कॉपी करें जहाँ आप लोग चाहते हैं।
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
startingPoint = [touch locationInView:self.view];
NSLog(@"Touch starting point = x : %f Touch Starting Point = y : %f", touchPoint.x, touchPoint.y);
}
-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
}
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
touchPoint = [touch locationInView:self.view];
NSLog(@"Touch end point =x : %f Touch end point =y : %f", touchPoint.x, touchPoint.y);
}
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
touchPoint = [touch locationInView:self.view];
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(touchPoint.x,touchPoint.y)];
[path addLineToPoint:CGPointMake(startingPoint.x,startingPoint.y)];
startingPoint=touchPoint;
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = [path CGPath];
shapeLayer.strokeColor = [[UIColor blueColor] CGColor];
shapeLayer.lineWidth = 3.0;
shapeLayer.fillColor = [[UIColor redColor] CGColor];
[self.view.layer addSublayer:shapeLayer];
NSLog(@"Touch moving point =x : %f Touch moving point =y : %f", touchPoint.x, touchPoint.y);
[self.view setNeedsDisplay];
}
- (void)tapGestureRecognizer:(UIGestureRecognizer *)recognizer {
CGPoint tappedPoint = [recognizer locationInView:self.view];
CGFloat xCoordinate = tappedPoint.x;
CGFloat yCoordinate = tappedPoint.y;
NSLog(@"Touch Using UITapGestureRecognizer x : %f y : %f", xCoordinate, yCoordinate);
}
यह एक रेखा की तरह खींचेगा, जहां उंगली जा रही है