UIView में रेखा खींचें


86

मुझे UIView में एक क्षैतिज रेखा खींचनी होगी। इसे करने का सबसे आसान तरीका क्या है। उदाहरण के लिए, मैं y-निर्देशांक = 200 पर एक काली क्षैतिज रेखा खींचना चाहता हूं।

मैं इंटरफ़ेस बिल्डर का उपयोग नहीं कर रहा हूं।


1
यहाँ सभी iOS में सही ढंग से सिंगल-पिक्सेल लाइन होने का पूरा और आसान समाधान दिया गया है, और स्टोरीबोर्ड में इसे आसान बना रहा है: stackoverflow.com/a/26525466/294884
Fattie

जवाबों:


122

आपके मामले में सबसे आसान तरीका (क्षैतिज रेखा) काले रंग की पृष्ठभूमि के रंग और फ्रेम के साथ एक सबव्यू जोड़ना है [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...

दूसरा तरीका यह है कि एक ऐसी क्लास बनाई जाए जो अपने ड्रॉअर मेथड में एक लाइन तैयार करे (आप इसके लिए मेरा कोड सैंपल यहाँ देख सकते हैं )।


स्टोरीबोर्ड में किसी भी कोड के बिना ऐसा करें। यह आसान और बेहतर है।
coolcool1994

3
@ coolcool1994, आपने ध्यान नहीं दिया "मैं इंटरफ़ेस बिल्डर का उपयोग नहीं कर रहा हूं।" प्रश्न में आवश्यकता है?
माइकल केसलर

312

शायद यह थोड़ा देर हो गया है, लेकिन मैं जोड़ना चाहता हूं कि एक बेहतर तरीका है। 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);
}

यदि इस कोड का उपयोग UIView में किया जाता है, तो इस नमूने के निर्देशांक दृश्य या संपूर्ण स्क्रीन की सीमा के सापेक्ष हैं?
क्रिस

क्या किसी को CGContextBeginPath(context);पहले फोन करने की जरूरत नहीं है CGContextMoveToPoint(...);?
आई_म_जॉर्फ

37
ऐसा करने के लिए एक दृश्य का उपयोग करना बहुत भयानक नहीं है। यह चीजों को आसान बनाता है, उदाहरण के लिए, जब अभिविन्यास परिवर्तन के दौरान निहित एनिमेशन करते हैं। यदि यह सिर्फ एक है, तो एक और UIView यह सब महंगा नहीं है और कोड बहुत सरल है।
21

इसके अलावा, आप इन कोडों के साथ सीमा और मध्य बिंदु प्राप्त कर सकते हैं: CGPoint midPoint; midPoint.x = self.bounds.size. उपलब्धता / 2; midPoint.y = self.bounds.size.height / 2;
coolcool1994

1
सही है कि टिप्पणी "धीमी" समझदार नहीं है। किसी भी समय स्क्रीन पर बड़ी संख्या में सरल UIView हैं। ध्यान दें कि ड्राइंग (एक!) पाठ वर्ण, जिसमें सभी प्रसंस्करण शामिल हैं, एक भरा हुआ यूआईवाईयूई ड्राइंग करता है।
फेटी

30

स्विफ्ट 3 और स्विफ्ट 4

यह है कि आप अपने विचार के अंत में एक ग्रे लाइन कैसे बना सकते हैं (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()
        }
    }
}

जब दृश्य से कॉल किया जाता है तो "यदि संदर्भ दें" विफल रहता है।
ऑस्कर

14

बस पाठ के बिना और पृष्ठभूमि रंग के साथ एक लेबल जोड़ें। अपनी पसंद के निर्देशांक सेट करें और ऊंचाई और चौड़ाई भी। आप इसे मैन्युअल रूप से या इंटरफ़ेस बिल्डर के साथ कर सकते हैं।


11

आप इसके लिए 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];

11

एक दूसरे (और एक छोटी भी) संभावना। यदि आप ड्राअरक्ट के अंदर हैं, तो निम्न में से कुछ:

[[UIColor blackColor] setFill];
UIRectFill((CGRect){0,200,rect.size.width,1});

0

गाइ डाहर के जवाब के आधार पर।

मैं उपयोग करने से बचने की कोशिश करता हूं? क्योंकि यह एक अनुप्रयोग दुर्घटना का कारण बन सकता है अगर 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()
        }
    }
}

2
यदि ifक्लॉज का कारण वैकल्पिक से केवल अनबॉक्स करना है, तो guardइसके बजाय कथन का उपयोग करना पसंद करें ।
जूलियो फ्लोर्स

-1

पाठ के बिना लेबल जोड़ें और पृष्ठभूमि के रंग के साथ इसी फ्रेम का आकार (उदा: ऊंचाई = 1)। इसे कोड के माध्यम से या इंटरफ़ेस बिल्डर में करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.