আইফোন অ্যাপ্লিকেশন - কীভাবে একটি কাস্টম ইউআইভিউ আঁকতে হয় যে এটি কেবল একটি চেনাশোনা


129

আমি কীভাবে এমন একটি কাস্টম ইউআইভিউ আঁকতে যাব যা আক্ষরিকভাবে কেবল একটি বল (একটি 2 ডি সার্কেল)? আমি কি শুধু ড্ররেক্ট পদ্ধতিটি ওভাররাইড করব? এবং কেউ আমাকে নীল বৃত্ত আঁকার জন্য কোডটি প্রদর্শন করতে পারেন?

এছাড়াও, ক্লাসের মধ্যেই এই দৃশ্যের ফ্রেমটি পরিবর্তন করা ঠিক হবে? অথবা আমার কি আলাদা ক্লাস থেকে ফ্রেম পরিবর্তন করা দরকার?

(কেবল চারদিকে বাউন্স করে বল সেট আপ করার চেষ্টা করা হচ্ছে)

উত্তর:


209

আপনি কোয়ার্টজোর ব্যবহার করতে পারেন এবং এটি কিছু করতে পারেন -

self.circleView = [[UIView alloc] initWithFrame:CGRectMake(10,20,100,100)];
self.circleView.alpha = 0.5;
self.circleView.layer.cornerRadius = 50;  // half the width/height
self.circleView.backgroundColor = [UIColor blueColor];

104
এফওয়াইআই, আপনার দর্শনটি কোয়ার্টকোর ব্যবহার করে একটি বৃত্ত হওয়ার জন্য, আপনার কোণার ব্যাসার্ধটি আপনার ফ্রেমের উচ্চতা / প্রস্থের অর্ধেক হওয়া উচিত। এটি একটি বৃত্ত তৈরির সহজতম উপায়, তবে অগত্যা সবচেয়ে কার্যকর নয় is যদি কর্মক্ষমতা জরুরী হয় তবে ড্রআরেক্ট সম্ভবত আরও ভাল ফলাফল করবে results
বেনিয়ামিন মায়ো

4
এবং এটা করা হয়. 100 উচ্চতা / প্রস্থ হয়।
কল

3
হ্যাঁ, দুঃখিত আপনাকে নির্দেশ দিচ্ছিল না, কাল। আমি স্ট্যানলকে বিভিন্ন আকারের মতামত ব্যবহার করতে চাইলে উল্লেখ করেছি।
বেনিয়ামিন মায়ো

যদি আপনার চেনাশোনা দেখার আকারটি 100X100 না হয়, কোণার রেডিওটিসটি (নতুন আকার) / 2
গ্রান 33

তবে আমি লক্ষ্য করেছি যে কর্নারডিয়াসযুক্ত বৃত্তটি মাঝে মাঝে কিছুটা "ফ্ল্যাট" / ক্লিপড প্রান্তযুক্ত থাকে। কমপক্ষে যখন কোনও সীমানা ব্যবহার করা হয়। কোন ধারণা কেন? ব্যাসার্ধটি দেখার আকারের ঠিক অর্ধেক। আমি ভেবেছিলাম এটি ক্লিপিংয়ের সমস্যা হতে পারে, তবে এটির মতো মনে হচ্ছে না, এমনকি একটি ছোট সাবলেয়ার দিয়ে চেষ্টা করেছে - এখনও একই প্রভাব রয়েছে।
আইএনএক্স

135

আমি কি শুধু ড্ররেক্ট পদ্ধতিটি ওভাররাইড করব?

হ্যাঁ:

- (void)drawRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(ctx, rect);
    CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor blueColor] CGColor]));
    CGContextFillPath(ctx);
}

এছাড়াও, ক্লাসের মধ্যেই এই দৃশ্যের ফ্রেমটি পরিবর্তন করা ঠিক হবে?

আদর্শভাবে না, তবে আপনি পারেন।

অথবা আমার কি আলাদা ক্লাস থেকে ফ্রেম পরিবর্তন করা দরকার?

আমি পিতামাতাকে নিয়ন্ত্রণ করতে দেব।


1
আমি কীভাবে কাস্টম রঙগুলি সেট করতে পারি, কেবল নীল নয়? আমি সাদা এবং নীল এই জাতীয় ব্যবহার করার চেষ্টা করি: ([সেল্ফালংআর সার্কেল সিজি কালার]) তবে কিছুই হয় না: \
গাউসব্লুরিনিক

@ লল্ডপটি কি ইউ.আই.সি.র সার্কেল? সেট করা আছে? আপনি যদি সেই লাইনে ব্রেকআপপয়েন্ট রেখে মানটির দিকে তাকান, আপনি কী আশা করছেন তা কি? যদি আপনি এটি স্থির করে থাকেন তবে আপনাকে আপনার দর্শনটির অংশটি অবৈধ করতে হবে যার মধ্যে চেনাশোনা রয়েছে।
স্টিভ

9
@gaussblurinc ব্যবহার CGContextSetFillColorWithColor(ctx, self.colorOfCircle.CGColor);, পদ্ধতি দ্রবণে প্রস্তাবিত CGColorGetComponentsশুধুমাত্র কিছু রং সঙ্গে কাজ করে দেখতে stackoverflow.com/questions/9238743/...
yonilevy

যে কেউ এই বিষয়ে আটকে যায় তাদের কাছে নোট করুন। পরিবর্তে rect, আমি দুর্ঘটনাক্রমে self.frameউপবৃত্তের জন্য ব্যবহার করেছি । সঠিক মান self.bounds। ডি আহা! :)
অলি

31

ইউআইবিজেয়ারপথ ব্যবহার করে এখানে আরও একটি উপায় দেওয়া হয়েছে (সম্ভবত এটি অনেক দেরি হয়ে গেছে ^^) একটি বৃত্ত তৈরি করুন এবং এটির সাথে ইউআইভিউউকে মাস্ক করুন, নীচে:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
view.backgroundColor = [UIColor blueColor];

CAShapeLayer *shape = [CAShapeLayer layer];
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:view.center radius:(view.bounds.size.width / 2) startAngle:0 endAngle:(2 * M_PI) clockwise:YES];
shape.path = path.CGPath;
view.layer.mask = shape;

1
সেই আকৃতির স্তরটিকে একটি মুখোশ তৈরি করার দরকার নেই; আপনি কেবল আকারের স্তর হিসাবে আকৃতি স্তরটি সরাসরি ব্যবহার করতে পারেন এবং এটিকে একটি পূর্ণ রঙ দিতে পারেন। মুখোশটি সম্ভবত উল্লেখযোগ্যভাবে বেশি ব্যয়বহুল।
জেসি রুশাক

ইউআইভিউয়ের স্তরটি ক্যালায়ার তাই আমরা কীভাবে এই স্তরটিতে একটি আকার আঁকতে পারি। আমি মনে করি যে আমরা এর স্তরটি মাস্কিং ছাড়াই আকৃতির স্তরটি যুক্ত করব ??
জিন্টামা

1
আপনি শ্রেণিবৃদ্ধিটি ইউআইভিউ সাবক্লাস করতে পারেন এবং layerClassশ্রেণীর পদ্ধতিটিকে আকারের স্তর হিসাবে তৈরি করতে পারেন।
জেসি রুশাক

@ জেসারুসাক, আপনার পরামর্শটি (ইউআইভিউর স্তরে নিজেই আকারটি সেট করার জন্য) নিয়ে আমার যে সমস্যা হচ্ছে তা হ'ল আপনি ব্যাকগ্রাউন্ড কালার সঠিকভাবে ব্যবহার করতে পারবেন না। আপনাকে একটি ফিল কালার প্রয়োগ করতে হবে এবং ব্যাকগ্রাউন্ড কালার ক্লিয়ার কালারে সেট করতে হবে, যার অর্থ ইউআইভিউয়ের কোনও ব্যবহারকারী প্রাকৃতিকভাবে ব্যাকগ্রাউন্ড কালার সেট করতে সক্ষম হবে না।
রিচার্ড ভেনেবল

25

একটি সুইফট এক্সটেনশন সহ আমার অবদান:

extension UIView {
    func asCircle() {
        self.layer.cornerRadius = self.frame.width / 2;
        self.layer.masksToBounds = true
    }
}

শুধু কল myView.asCircle()


masksToBoundsসত্যে সেট করা এবং ব্যবহার করা selfএই উত্তরের মধ্যে সমস্ত বিকল্প, তবে এটি এখনও সবচেয়ে সংক্ষিপ্ত এবং সর্বোত্তম সমাধান
ম্যাক্স দেশিয়াতভ

17

সুইফট 3 - কাস্টম ক্লাস, পুনরায় ব্যবহার করা সহজ। এটি backgroundColorইউআই বিল্ডারে সেট ব্যবহার করে

import UIKit

@IBDesignable
class CircleBackgroundView: UIView {

    override func layoutSubviews() {
        super.layoutSubviews()
        layer.cornerRadius = bounds.size.width / 2
        layer.masksToBounds = true
    }

}

1
চমৎকার। এটি সঠিক, অভিযোজিত পদ্ধতি।
Womble

14

সুইফট 3 শ্রেণি:

import UIKit

class CircleView: UIView {

    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else {return}

        context.addEllipse(in: rect)
        context.setFillColor(.blue.cgColor)
        context.fillPath()
    }           
}

6

চেনাশোনা (এবং অন্যান্য আকার) আঁকার অন্য উপায় হ'ল মুখোশ ব্যবহার করে। আপনি প্রথমে আপনার প্রয়োজনীয় আকারের মুখোশ তৈরির মাধ্যমে চেনাশোনাগুলি বা অন্যান্য আকারগুলি আঁকুন, দ্বিতীয়ত, আপনার রঙের স্কোয়ার সরবরাহ করুন এবং তৃতীয়ত, সেই বর্ণের স্কোয়ারগুলিতে মাস্ক প্রয়োগ করুন। নতুন কাস্টম বৃত্ত বা অন্য আকার পেতে আপনি মুখোশ বা রঙ পরিবর্তন করতে পারেন।

#import <QuartzCore/QuartzCore.h>

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *area1;
@property (weak, nonatomic) IBOutlet UIView *area2;
@property (weak, nonatomic) IBOutlet UIView *area3;
@property (weak, nonatomic) IBOutlet UIView *area4;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.area1.backgroundColor = [UIColor blueColor];
    [self useMaskFor: self.area1];

    self.area2.backgroundColor = [UIColor orangeColor];
    [self useMaskFor: self.area2];

    self.area3.backgroundColor = [UIColor colorWithRed: 1.0 green: 0.0 blue: 0.5 alpha:1.0];
    [self useMaskFor: self.area3];

    self.area4.backgroundColor = [UIColor colorWithRed: 1.0 green: 0.0 blue: 0.5 alpha:0.5];
    [self useMaskFor: self.area4];        
}

- (void)useMaskFor: (UIView *)colorArea {        
    CALayer *maskLayer = [CALayer layer];
    maskLayer.frame = colorArea.bounds;
    UIImage *maskImage = [UIImage imageNamed:@"cirMask.png"];
    maskLayer.contents = (__bridge id)maskImage.CGImage;
    colorArea.layer.mask = maskLayer;
}

@end

উপরের কোডটির আউটপুট এখানে দেওয়া হল:

চারটি চেনাশোনা


2

অলস লোকদের জন্য আরও একটি বিকল্প রয়েছে। আপনি ইন্টারফেস বিল্ডারে আপনার দর্শনের layer.cornerRadius মূল পথটি সেট করতে পারেন । উদাহরণস্বরূপ, যদি আপনার দর্শনটির প্রস্থ = 48 উচ্চতা থাকে তবে সেট করুন :layer.cornerRadius = 24

এখানে চিত্র বর্ণনা লিখুন

তবে এটি কেবলমাত্র তখনই কার্যকর হয় যদি আপনার দৃশ্যের স্থির আকার থাকে (width/height is fixed)এবং এটি ইন্টারফেস বিল্ডারে চেনাশোনাটি প্রদর্শন করে না।


1

সুইফট 3 - এক্সকোড 8.1

@IBOutlet weak var myView: UIView!

override func viewDidLoad() {
    super.viewDidLoad() 

    let size:CGFloat = 35.0
    myView.bounds = CGRect(x: 0, y: 0, width: size, height: size)
    myView.layer.cornerRadius = size / 2
    myView.layer.borderWidth = 1
    myView.layer.borderColor = UIColor.Gray.cgColor        
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.