मुझे UIView में एक क्षैतिज रेखा खींचनी होगी। इसे करने का सबसे आसान तरीका क्या है। उदाहरण के लिए, मैं y-निर्देशांक = 200 पर एक काली क्षैतिज रेखा खींचना चाहता हूं।
मैं इंटरफ़ेस बिल्डर का उपयोग नहीं कर रहा हूं।
मुझे UIView में एक क्षैतिज रेखा खींचनी होगी। इसे करने का सबसे आसान तरीका क्या है। उदाहरण के लिए, मैं y-निर्देशांक = 200 पर एक काली क्षैतिज रेखा खींचना चाहता हूं।
मैं इंटरफ़ेस बिल्डर का उपयोग नहीं कर रहा हूं।
जवाबों:
आपके मामले में सबसे आसान तरीका (क्षैतिज रेखा) काले रंग की पृष्ठभूमि के रंग और फ्रेम के साथ एक सबव्यू जोड़ना है [0, 200, 320, 1]
।
कोड नमूना (मुझे आशा है कि कोई त्रुटि नहीं है - मैंने इसे Xcode के बिना लिखा है):
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 1)];
lineView.backgroundColor = [UIColor blackColor];
[self.view addSubview:lineView];
[lineView release];
// You might also keep a reference to this view
// if you are about to change its coordinates.
// Just create a member and a property for this...
दूसरा तरीका यह है कि एक ऐसी क्लास बनाई जाए जो अपने ड्रॉअर मेथड में एक लाइन तैयार करे (आप इसके लिए मेरा कोड सैंपल यहाँ देख सकते हैं )।
शायद यह थोड़ा देर हो गया है, लेकिन मैं जोड़ना चाहता हूं कि एक बेहतर तरीका है। UIView का उपयोग करना सरल है, लेकिन अपेक्षाकृत धीमा है। यह विधि ओवरराइड करती है कि कैसे दृश्य खुद को खींचता है और तेज होता है:
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context, 2.0f);
CGContextMoveToPoint(context, 0.0f, 0.0f); //start at this point
CGContextAddLineToPoint(context, 20.0f, 20.0f); //draw to this point
// and now draw the Path!
CGContextStrokePath(context);
}
CGContextBeginPath(context);
पहले फोन करने की जरूरत नहीं है CGContextMoveToPoint(...);
?
यह है कि आप अपने विचार के अंत में एक ग्रे लाइन कैसे बना सकते हैं (b123400 के उत्तर के समान विचार)
class CustomView: UIView {
override func draw(_ rect: CGRect) {
super.draw(rect)
if let context = UIGraphicsGetCurrentContext() {
context.setStrokeColor(UIColor.gray.cgColor)
context.setLineWidth(1)
context.move(to: CGPoint(x: 0, y: bounds.height))
context.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
context.strokePath()
}
}
}
आप इसके लिए UIBezierPath Class का उपयोग कर सकते हैं:
और जितनी चाहे उतनी लाइनें खींच सकते हैं:
मैंने UIView को उपवर्गित किया है:
@interface MyLineDrawingView()
{
NSMutableArray *pathArray;
NSMutableDictionary *dict_path;
CGPoint startPoint, endPoint;
}
@property (nonatomic,retain) UIBezierPath *myPath;
@end
और pathArray और तानाशाही ऑब्जेक्ट्स को इनिशियलाइज़ किया जो लाइन ड्रॉइंग के लिए उपयोग किया जाएगा। मैं अपनी स्वयं की परियोजना से कोड का मुख्य भाग लिख रहा हूं:
- (void)drawRect:(CGRect)rect
{
for(NSDictionary *_pathDict in pathArray)
{
[((UIColor *)[_pathDict valueForKey:@"color"]) setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
[[_pathDict valueForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
}
[[dict_path objectForKey:@"color"] setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
[[dict_path objectForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
}
स्पर्श विधि:
UITouch *touch = [touches anyObject];
startPoint = [touch locationInView:self];
myPath=[[UIBezierPath alloc]init];
myPath.lineWidth = currentSliderValue*2;
dict_path = [[NSMutableDictionary alloc] init];
स्पर्श विधि:
UITouch *touch = [touches anyObject];
endPoint = [touch locationInView:self];
[myPath removeAllPoints];
[dict_path removeAllObjects];// remove prev object in dict (this dict is used for current drawing, All past drawings are managed by pathArry)
// actual drawing
[myPath moveToPoint:startPoint];
[myPath addLineToPoint:endPoint];
[dict_path setValue:myPath forKey:@"path"];
[dict_path setValue:strokeColor forKey:@"color"];
// NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
// [pathArray addObject:tempDict];
// [dict_path removeAllObjects];
[self setNeedsDisplay];
स्पर्श विधि:
NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
[pathArray addObject:tempDict];
[dict_path removeAllObjects];
[self setNeedsDisplay];
गाइ डाहर के जवाब के आधार पर।
मैं उपयोग करने से बचने की कोशिश करता हूं? क्योंकि यह एक अनुप्रयोग दुर्घटना का कारण बन सकता है अगर GetCurrentContext () एनआईएल देता है।
अगर मैं बयान की जाँच करता हूँ:
class CustomView: UIView
{
override func draw(_ rect: CGRect)
{
super.draw(rect)
if let context = UIGraphicsGetCurrentContext()
{
context.setStrokeColor(UIColor.gray.cgColor)
context.setLineWidth(1)
context.move(to: CGPoint(x: 0, y: bounds.height))
context.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
context.strokePath()
}
}
}
if
क्लॉज का कारण वैकल्पिक से केवल अनबॉक्स करना है, तो guard
इसके बजाय कथन का उपयोग करना पसंद करें ।