কীভাবে কোনও ইউআইভিউর শীর্ষের দিকে সীমানা যুক্ত করা যায়


144

আমার প্রশ্ন শিরোনাম হয়।

আমি জানি না কীভাবে কোনও নির্দিষ্ট দিকে, উপরে বা নীচে, কোনও দিকে কোনও layer.borderসীমানা যুক্ত করা যায় ... পুরো দৃষ্টির জন্য সীমানাটি আঁকুন ...


উত্তর:


200

আমি এখানে সাবক্লাসিং UIViewএবং ওভাররাইডিং drawRectওভারকিল বিবেচনা করি । কেন একটি এক্সটেনশান UIViewযুক্ত এবং সীমান্ত সংক্ষিপ্তসার যুক্ত করবেন না?

@discardableResult
func addBorders(edges: UIRectEdge,
                color: UIColor,
                inset: CGFloat = 0.0,
                thickness: CGFloat = 1.0) -> [UIView] {

    var borders = [UIView]()

    @discardableResult
    func addBorder(formats: String...) -> UIView {
        let border = UIView(frame: .zero)
        border.backgroundColor = color
        border.translatesAutoresizingMaskIntoConstraints = false
        addSubview(border)
        addConstraints(formats.flatMap {
            NSLayoutConstraint.constraints(withVisualFormat: $0,
                                           options: [],
                                           metrics: ["inset": inset, "thickness": thickness],
                                           views: ["border": border]) })
        borders.append(border)
        return border
    }


    if edges.contains(.top) || edges.contains(.all) {
        addBorder(formats: "V:|-0-[border(==thickness)]", "H:|-inset-[border]-inset-|")
    }

    if edges.contains(.bottom) || edges.contains(.all) {
        addBorder(formats: "V:[border(==thickness)]-0-|", "H:|-inset-[border]-inset-|")
    }

    if edges.contains(.left) || edges.contains(.all) {
        addBorder(formats: "V:|-inset-[border]-inset-|", "H:|-0-[border(==thickness)]")
    }

    if edges.contains(.right) || edges.contains(.all) {
        addBorder(formats: "V:|-inset-[border]-inset-|", "H:[border(==thickness)]-0-|")
    }

    return borders
}

    // Usage:         
    view.addBorder(edges: [.all]) // All with default arguments 
    view.addBorder(edges: [.top], color: .green) // Just Top, green, default thickness
    view.addBorder(edges: [.left, .right, .bottom], color: .red, thickness: 3) // All except Top, red, thickness 3

এই কোডের সাহায্যে আপনিও আপনার সাবক্লাসের সাথে আবদ্ধ নন, আপনি যে কোনও কিছুতে এবং উত্তরাধিকার সূত্রে প্রাপ্ত সমস্ত কিছুতে UIView- আপনার প্রকল্পে পুনরায় ব্যবহারযোগ্য এবং অন্য যে কোনওটিতে এটি প্রয়োগ করতে পারেন । অন্যান্য রং এবং প্রস্থকে সংজ্ঞায়িত করতে আপনার পদ্ধতিগুলিতে অন্যান্য যুক্তিতে পাস করুন। অনেক বিকল্প।


4
এখানে কেবলমাত্র খারাপ দিকটি এটি আকার পরিবর্তন করতে পারে না।
পিটার ডিউইজ

2
একটি ইউআইভিউ ব্যবহার করতে পারে এবং স্বয়ংক্রিয় বিন্যাসের সীমাবদ্ধতা যুক্ত করতে পারে। একই নীতি।
আদম ওয়েট

1
@ পিটারডিউইজ এটি কোনও নেতিবাচক দিক নয় - আপনি যদি সীমানার আকারের উপর নিয়ন্ত্রণ রাখতে চান তবে আপনাকে যা করতে হবে তা হ'ল কিছু: হ'ল: (অকার্যকর) অ্যাডপুটারবার্ডার উইথসাইজ: (সিজিফ্লোট) আকার এবং তারপরে ক্রিয়াকলাপটির সাথে পরামিতিটি প্রতিস্থাপন করুন । একই রকম রঙের মতো অন্যান্য পরামিতিগুলির জন্যও যায়।
o.shnn

1
@ অ্যাডামওয়েট, এই অটো লেআউটটির রূপটি খুব ভাল দেখাচ্ছে। ধন্যবাদ !
manonthemoon

2
ভাগ করে নেওয়ার জন্য ধন্যবাদ, আমি এখানে স্বয়ংক্রিয় লেআউট সীমাবদ্ধতার সাথে উদ্দেশ্য-সি এর একটি সংস্করণ তৈরি করি ।
Itachi

99

গোলাকার কোণগুলির জন্য অ্যাডাম ওয়েটের মূল পোস্টে এবং একাধিক সম্পাদনাগুলির জন্য ক্ষমতা যুক্ত করা হয়েছে

গুরুত্বপূর্ণ !: ঠিক আগের হিসাবে মন্তব্য হিসাবে 'অ্যাডবোর্ডার' কল করার আগে ঠিক 'লেবেল.ইলআউটআইফনেড ()' যুক্ত করতে ভুলবেন না

দ্রষ্টব্য: আমি এটি কেবল ইউআইএলবেলে পরীক্ষা করেছি।

এক্সটেনশন CALayer

enum BorderSide {
    case top
    case right
    case bottom
    case left
    case notRight
    case notLeft
    case topAndBottom
    case all
}

enum Corner {
    case topLeft
    case topRight
    case bottomLeft
    case bottomRight
}

func addBorder(side: BorderSide, thickness: CGFloat, color: CGColor, maskedCorners: CACornerMask? = nil) {
    var topWidth = frame.size.width; var bottomWidth = topWidth
    var leftHeight = frame.size.height; var rightHeight = leftHeight

    var topXOffset: CGFloat = 0; var bottomXOffset: CGFloat = 0
    var leftYOffset: CGFloat = 0; var rightYOffset: CGFloat = 0

    // Draw the corners and set side offsets
    switch maskedCorners {
    case [.layerMinXMinYCorner, .layerMaxXMinYCorner]: // Top only
        addCorner(.topLeft, thickness: thickness, color: color)
        addCorner(.topRight, thickness: thickness, color: color)
        topWidth -= cornerRadius*2
        leftHeight -= cornerRadius; rightHeight -= cornerRadius
        topXOffset = cornerRadius; leftYOffset = cornerRadius; rightYOffset = cornerRadius

    case [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]: // Bottom only
        addCorner(.bottomLeft, thickness: thickness, color: color)
        addCorner(.bottomRight, thickness: thickness, color: color)
        bottomWidth -= cornerRadius*2
        leftHeight -= cornerRadius; rightHeight -= cornerRadius
        bottomXOffset = cornerRadius

    case [.layerMinXMinYCorner, .layerMinXMaxYCorner]: // Left only
        addCorner(.topLeft, thickness: thickness, color: color)
        addCorner(.bottomLeft, thickness: thickness, color: color)
        topWidth -= cornerRadius; bottomWidth -= cornerRadius
        leftHeight -= cornerRadius*2
        leftYOffset = cornerRadius; topXOffset = cornerRadius; bottomXOffset = cornerRadius;

    case [.layerMaxXMinYCorner, .layerMaxXMaxYCorner]: // Right only
        addCorner(.topRight, thickness: thickness, color: color)
        addCorner(.bottomRight, thickness: thickness, color: color)
        topWidth -= cornerRadius; bottomWidth -= cornerRadius
        rightHeight -= cornerRadius*2
        rightYOffset = cornerRadius

    case [.layerMaxXMinYCorner, .layerMaxXMaxYCorner,  // All
          .layerMinXMaxYCorner, .layerMinXMinYCorner]:
        addCorner(.topLeft, thickness: thickness, color: color)
        addCorner(.topRight, thickness: thickness, color: color)
        addCorner(.bottomLeft, thickness: thickness, color: color)
        addCorner(.bottomRight, thickness: thickness, color: color)
        topWidth -= cornerRadius*2; bottomWidth -= cornerRadius*2
        topXOffset = cornerRadius; bottomXOffset = cornerRadius
        leftHeight -= cornerRadius*2; rightHeight -= cornerRadius*2
        leftYOffset = cornerRadius; rightYOffset = cornerRadius

    default: break
    }

    // Draw the sides
    switch side {
    case .top:
        addLine(x: topXOffset, y: 0, width: topWidth, height: thickness, color: color)

    case .right:
        addLine(x: frame.size.width - thickness, y: rightYOffset, width: thickness, height: rightHeight, color: color)

    case .bottom:
        addLine(x: bottomXOffset, y: frame.size.height - thickness, width: bottomWidth, height: thickness, color: color)

    case .left:
        addLine(x: 0, y: leftYOffset, width: thickness, height: leftHeight, color: color)

    // Multiple Sides
    case .notRight:
        addLine(x: topXOffset, y: 0, width: topWidth, height: thickness, color: color)
        addLine(x: 0, y: leftYOffset, width: thickness, height: leftHeight, color: color)
        addLine(x: bottomXOffset, y: frame.size.height - thickness, width: bottomWidth, height: thickness, color: color)

    case .notLeft:
        addLine(x: topXOffset, y: 0, width: topWidth, height: thickness, color: color)
        addLine(x: frame.size.width - thickness, y: rightYOffset, width: thickness, height: rightHeight, color: color)
        addLine(x: bottomXOffset, y: frame.size.height - thickness, width: bottomWidth, height: thickness, color: color)

    case .topAndBottom:
        addLine(x: topXOffset, y: 0, width: topWidth, height: thickness, color: color)
        addLine(x: bottomXOffset, y: frame.size.height - thickness, width: bottomWidth, height: thickness, color: color)

    case .all:
        addLine(x: topXOffset, y: 0, width: topWidth, height: thickness, color: color)
        addLine(x: frame.size.width - thickness, y: rightYOffset, width: thickness, height: rightHeight, color: color)
        addLine(x: bottomXOffset, y: frame.size.height - thickness, width: bottomWidth, height: thickness, color: color)
        addLine(x: 0, y: leftYOffset, width: thickness, height: leftHeight, color: color)
    }
}

private func addLine(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat, color: CGColor) {
    let border = CALayer()
    border.frame = CGRect(x: x, y: y, width: width, height: height)
    border.backgroundColor = color
    addSublayer(border)
}

private func addCorner(_ corner: Corner, thickness: CGFloat, color: CGColor) {
    // Set default to top left
    let width = frame.size.width; let height = frame.size.height
    var x = cornerRadius
    var startAngle: CGFloat = .pi; var endAngle: CGFloat = .pi*3/2

    switch corner {
    case .bottomLeft: startAngle = .pi/2; endAngle = .pi

    case .bottomRight:
        x = width - cornerRadius
        startAngle = 0; endAngle = .pi/2

    case .topRight:
        x = width - cornerRadius
        startAngle = .pi*3/2; endAngle = 0

    default: break
    }

    let cornerPath = UIBezierPath(arcCenter: CGPoint(x: x, y: height / 2),
                                  radius: cornerRadius - thickness,
                                  startAngle: startAngle,
                                  endAngle: endAngle,
                                  clockwise: true)

    let cornerShape = CAShapeLayer()
    cornerShape.path = cornerPath.cgPath
    cornerShape.lineWidth = thickness
    cornerShape.strokeColor = color
    cornerShape.fillColor = nil
    addSublayer(cornerShape)
}

}


4
এই কোডটি কোনও কারণে স্যুইফট 3 এ কাজ করছে না, সিজিআরেক্টমেক স্বাক্ষর এবং স্যুইফ্ট 3
তে

সেখানে একটি ভাল নিবন্ধ এখানে medium.com/swift-programming/... আপনি সুইফট 3. জন্য যা করতে হবে তা সম্পর্কে আলোচনা
মীখা Montoya

2
কোন ভাগ্য দ্রুত এই 3 বাস্তবায়ন?
মারভোয়াভিস ড্রাগন

7
এটি কার্যকর করতে, আপনাকে view.layoutIfNeeded()কল করার আগে ডান যুক্ত করতে হবে view.layer.addBorder(...)। তারপরে এটি সুইফট 3
অ্যাডাম স্টাডেনিক

এটা ঠিক কাজ করছে। এই পদ্ধতিতে লাইনটি যুক্ত করুনoverride func viewDidLayoutSubviews()
অ্যান্টনি রাফেল

60

আমার জন্য সর্বোত্তম adding viewsউপায়টি ইউআইভিউ- তে একটি বিভাগ, তবে ক্যালায়ারগুলির পরিবর্তে, তাই আমরা take advantage of AutoresizingMasksনিশ্চিত করতে পারি যে তদারকির পাশাপাশি বর্ডারগুলির পুনরায় আকার তৈরি করা যায়।

উদ্দেশ্য গ

- (void)addTopBorderWithColor:(UIColor *)color andWidth:(CGFloat) borderWidth {
    UIView *border = [UIView new];
    border.backgroundColor = color;
    [border setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin];
    border.frame = CGRectMake(0, 0, self.frame.size.width, borderWidth);
    [self addSubview:border];
}

- (void)addBottomBorderWithColor:(UIColor *)color andWidth:(CGFloat) borderWidth {
    UIView *border = [UIView new];
    border.backgroundColor = color;
    [border setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin];
    border.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, borderWidth);
    [self addSubview:border];
}

- (void)addLeftBorderWithColor:(UIColor *)color andWidth:(CGFloat) borderWidth {
    UIView *border = [UIView new];
    border.backgroundColor = color;
    border.frame = CGRectMake(0, 0, borderWidth, self.frame.size.height);
    [border setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleRightMargin];
    [self addSubview:border];
}

- (void)addRightBorderWithColor:(UIColor *)color andWidth:(CGFloat) borderWidth {
    UIView *border = [UIView new];
    border.backgroundColor = color;
    [border setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin];
    border.frame = CGRectMake(self.frame.size.width - borderWidth, 0, borderWidth, self.frame.size.height);
    [self addSubview:border];
}

সুইফট 5

func addTopBorder(with color: UIColor?, andWidth borderWidth: CGFloat) {
    let border = UIView()
    border.backgroundColor = color
    border.autoresizingMask = [.flexibleWidth, .flexibleBottomMargin]
    border.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: borderWidth)
    addSubview(border)
}

func addBottomBorder(with color: UIColor?, andWidth borderWidth: CGFloat) {
    let border = UIView()
    border.backgroundColor = color
    border.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
    border.frame = CGRect(x: 0, y: frame.size.height - borderWidth, width: frame.size.width, height: borderWidth)
    addSubview(border)
}

func addLeftBorder(with color: UIColor?, andWidth borderWidth: CGFloat) {
    let border = UIView()
    border.backgroundColor = color
    border.frame = CGRect(x: 0, y: 0, width: borderWidth, height: frame.size.height)
    border.autoresizingMask = [.flexibleHeight, .flexibleRightMargin]
    addSubview(border)
}

func addRightBorder(with color: UIColor?, andWidth borderWidth: CGFloat) {
    let border = UIView()
    border.backgroundColor = color
    border.autoresizingMask = [.flexibleHeight, .flexibleLeftMargin]
    border.frame = CGRect(x: frame.size.width - borderWidth, y: 0, width: borderWidth, height: frame.size.height)
    addSubview(border)
}

7
এটি এখন পর্যন্ত এই সমস্যার অন্যতম সেরা সমাধান। অন্যান্য সমাধানগুলির বেশিরভাগই দর্শন পরিবর্তনের (এবং এইভাবে ডিভাইস রোটেশন বা স্প্লিট ভিউ) সম্মান করে না। এই এক না।
ওম্বল

1
গোলাকার কোণগুলিকে সমর্থন করার জন্য এটি কীভাবে মানিয়ে নেওয়া যায়?
এনটিজ

29

সুইফট 3.0

সুইফট 4.1

extension CALayer {

  func addBorder(edge: UIRectEdge, color: UIColor, thickness: CGFloat) {

    let border = CALayer()

    switch edge {
    case UIRectEdge.top:
        border.frame = CGRect(x: 0, y: 0, width: frame.width, height: thickness)

    case UIRectEdge.bottom:
        border.frame = CGRect(x:0, y: frame.height - thickness, width: frame.width, height:thickness)

    case UIRectEdge.left:
        border.frame = CGRect(x:0, y:0, width: thickness, height: frame.height)

    case UIRectEdge.right:
        border.frame = CGRect(x: frame.width - thickness, y: 0, width: thickness, height: frame.height)

    default: do {}
    }

    border.backgroundColor = color.cgColor

    addSublayer(border)
 }
}

1
যখন ভিউ পুনরায় আকার দেয়, উদাহরণস্বরূপ ওরিয়েন্টেশন পরিবর্তন হয় তখন এটি কাজ করে না।
নেস্টর

আপনি যদি ফ্রেম ভিত্তিক লেআউট ব্যবহার করছেন তবে আপনাকে লেআউটসুভিউগুলি বাস্তবায়ন করতে হবে এবং সেখানে সমস্ত সাবভিউ (বা সাবলেয়ার) ফ্রেমগুলি পুনরায় গণনা করতে হবে
ট্র্যাপার

22

উপশ্রেণী UIViewএবং বাস্তবায়ন drawRect:আপনার উপশ্রেণী যেমন দেখুন:

উদ্দেশ্য গ

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMinY(rect));
    CGContextAddLineToPoint(context, CGRectGetMaxX(rect), CGRectGetMinY(rect));
    CGContextSetStrokeColorWithColor(context, [[UIColor redColor] CGColor] );
    CGContextSetLineWidth(context, 2.0);
    CGContextStrokePath(context);
}

সুইফট 4

override func draw(_ rect: CGRect) {

    let cgContext = UIGraphicsGetCurrentContext()
    cgContext?.move(to: CGPoint(x: rect.minX, y: rect.minY))
    cgContext?.addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
    cgContext?.setStrokeColor(UIColor.red.cgColor)
    cgContext?.setLineWidth(2.0)
    cgContext?.strokePath()
}

এটি শীর্ষ সীমানা হিসাবে 2 পিক্সেল লাল রেখা আঁকবে। আপনি যে অন্যান্য বিভিন্ন প্রকারের উল্লেখ করেছেন তার সবগুলিই পাঠকের জন্য তুচ্ছ অনুশীলন হিসাবে রেখে গেছে।

কোয়ার্টজ 2 ডি প্রোগ্রামিং গাইড বাঞ্ছনীয়।


এটা কি একমাত্র উপায় ??? সুতরাং যদি আমাকে শীর্ষ সীমান্তের সাথে এবং নীচের সীমান্তের সাথে অন্য ভিউ এবং অন্য দৃশ্যের সাথে দেখার প্রয়োজন হয় ... আমি সর্বদা একটি বা দুটি সীমান্তের সাথে একটি নির্দিষ্ট দৃষ্টিভঙ্গি বলতে চাই, আমাকে প্রতিটি নির্দিষ্ট ক্ষেত্রে একটি সাবক্লাস তৈরি করতে হবে ??? শুধু সীমানা যুক্ত করার জন্য ক্লাস তৈরি করা সত্যিই চমৎকার কিনা তা আমি জানি না ...
manonthemoon

1
না। এটি সম্পর্কে চিন্তা করুন। আপনার UIViewসাবক্লাসে এমন একটি সম্পত্তি থাকতে পারে যা নির্ধারণ করে যে কী সীমানা drawRect:আঁকবে। এই বৈশিষ্ট্যটি NS_OPTIONSএমনভাবে সংজ্ঞায়িত করা যেতে পারে যাতে এটি বিটমাস্কের মতো বিটমাস্ককে সংজ্ঞায়িত করে UIViewAutoresizing। যদি - যে কোনও কারণেই - আপনি সত্যিই সাবক্লাসিংয়ের পক্ষে UIViewদৃ object়তার সাথে আপত্তি করেন তবে কেবল একটি ছোট 1-2 পিক্সেল উচ্চ (বা প্রশস্ত) সাবভিউ যুক্ত করুন এবং আপনি কোনও সীমানা অনুকরণ করতে চান এমন যে কোনও মাত্রা দিন।
ফ্লাফুলাসচিম্প

ওহে ছেলেরা, আমি এই কোডটি দ্বারা অনুপ্রাণিত একটি সুইফট সাবক্লাস তৈরি করেছি, আশা করি আপনি এটি উপভোগ করেছেন: gist.github.com/asiviero/4f52ab7dea7d9252a64c
asiviero

19

নির্বাচিত উত্তরের জন্য কোড, যদি কেউ এটি চায়।

দ্রষ্টব্য: এটি অটোলেআউট (ওরফে, আড়াআড়ি ডিভাইস ল্যান্ডস্কেপ ইত্যাদিতে) এর সাথে কাজ করে না।

প্রথমে একটি বেধ নির্ধারণ করুন:

NSInteger borderThickness = 1;

তারপরে আপনি যে সীমানা সেট করতে চান তা সেট করতে কেবল এই যেকোন একটি বা সমস্ত ব্যবহার করুন copy

শীর্ষ সীমানা

UIView *topBorder = [UIView new];
topBorder.backgroundColor = [UIColor lightGrayColor];
topBorder.frame = CGRectMake(0, 0, myView.frame.size.width, borderThickness);
[myView addSubview:topBorder];

নীচে বর্ডার

UIView *bottomBorder = [UIView new];
bottomBorder.backgroundColor = [UIColor lightGrayColor];
bottomBorder.frame = CGRectMake(0, myView.frame.size.height - borderThickness, myView.frame.size.width, borderThickness);
[myView addSubview:bottomBorder];

বাম সীমানা

UIView *leftBorder = [UIView new];
leftBorder.backgroundColor = [UIColor lightGrayColor];
leftBorder.frame = CGRectMake(0, 0, borderThickness, myView.frame.size.height);
[myView addSubview:leftBorder];

ডান সীমানা

UIView *rightBorder = [UIView new];
rightBorder.backgroundColor = [UIColor lightGrayColor];
rightBorder.frame = CGRectMake(myView.frame.size.width - borderThickness, 0, borderThickness, myView.frame.size.height);
[myView addSubview:rightBorder];

সহজ সরল সমাধান ... একটি ইউআইভিউ ওভারহেডের সাথে খালি ক্যালায়ারের সাথে তুলনা করা
সোবারম্যান

অন্যান্য সমস্ত সমাধান পড়ার পরে আমি ভাবছিলাম যে আমি কেবল একটি ছোট্ট ভিউও যুক্ত করব। সীমান্তের জন্য যে সব কাজ! এই সমাধানটির জন্য অটো লেআউটেও কাজ করতে কয়েক পিন প্রয়োজন। আপনার মাথা কাছাকাছি পেতে সহজ উপায়।
noobsmcgoobs

ধন্যবাদ, আমি উপরে একটি নোট যুক্ত করেছি যাতে কোডার কেবল তখনই ব্যবহার করতে পারে যদি তাদের অ্যাপটি ঘোরানো না হয়।
ট্র্যাভিস এম

15

পুরানো প্রশ্ন, তবে রানটাইম বর্ডার সামঞ্জস্য সহ অটোলেআউট-সলিউশন এখনও অনুপস্থিত।

borders(for: [.left, .bottom], width: 2, color: .red)

নিম্নলিখিত ইউআইভিউ এক্সটেনশান কেবল প্রদত্ত প্রান্তগুলিতে সীমানা যুক্ত করবে। আপনি রানটাইমের সময় প্রান্তগুলি পরিবর্তন করলে সীমানাগুলি সেই অনুযায়ী সামঞ্জস্য হবে।

extension UIView {
    func borders(for edges:[UIRectEdge], width:CGFloat = 1, color: UIColor = .black) {

        if edges.contains(.all) {
            layer.borderWidth = width
            layer.borderColor = color.cgColor
        } else {
            let allSpecificBorders:[UIRectEdge] = [.top, .bottom, .left, .right]

            for edge in allSpecificBorders {
                if let v = viewWithTag(Int(edge.rawValue)) {
                    v.removeFromSuperview()
                }

                if edges.contains(edge) {
                    let v = UIView()
                    v.tag = Int(edge.rawValue)
                    v.backgroundColor = color
                    v.translatesAutoresizingMaskIntoConstraints = false
                    addSubview(v)

                    var horizontalVisualFormat = "H:"
                    var verticalVisualFormat = "V:"

                    switch edge {
                    case UIRectEdge.bottom:
                        horizontalVisualFormat += "|-(0)-[v]-(0)-|"
                        verticalVisualFormat += "[v(\(width))]-(0)-|"
                    case UIRectEdge.top:
                        horizontalVisualFormat += "|-(0)-[v]-(0)-|"
                        verticalVisualFormat += "|-(0)-[v(\(width))]"
                    case UIRectEdge.left:
                        horizontalVisualFormat += "|-(0)-[v(\(width))]"
                        verticalVisualFormat += "|-(0)-[v]-(0)-|"
                    case UIRectEdge.right:
                        horizontalVisualFormat += "[v(\(width))]-(0)-|"
                        verticalVisualFormat += "|-(0)-[v]-(0)-|"
                    default:
                        break
                    }

                    self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: horizontalVisualFormat, options: .directionLeadingToTrailing, metrics: nil, views: ["v": v]))
                    self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: verticalVisualFormat, options: .directionLeadingToTrailing, metrics: nil, views: ["v": v]))
                }
            }
        }
    }
}

13

সুইফ্ট সংস্করণ:

var myView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
myView.backgroundColor = UIColor.yellowColor() 

var border = CALayer()
border.backgroundColor = UIColor.lightGrayColor()
border.frame = CGRect(x: 0, y: 0, width: myView.frame.width, height: 0.5)

myView.layer.addSublayer(border)

সম্পাদনা: জন্য আপডেট সংস্করণ আমার রেপো এখানে চেক করুন: https://github.com/goktugyil/EZSwiftExtensions/blob/master/Sources/UIViewExtensions.swift

অ্যাডবোর্ডার অংশগুলি দেখুন


4

আমি অ্যাডাম ওয়েইট এবং পলস উভয় উত্তর নিয়েছিলাম এবং তাদের সংযুক্ত করেছি। আমি নির্বাচিত প্রান্তগুলি একসাথে পাইপ করার সম্ভাবনাও যুক্ত করেছি, সুতরাং আপনার কেবলমাত্র একটি ফাংশন কল করতে হবে:

[self.view addBordersToEdge:(UIRectEdgeLeft|UIRectEdgeRight)
                  withColor:[UIColor grayColor]
                   andWidth:1.0];

অথবা তাই:

[self.view addBordersToEdge:(UIRectEdgeAll)
                  withColor:[UIColor grayColor]
                   andWidth:1.0];

আপনার যা বাস্তবায়নের দরকার তা হ'ল ইউআইভিউ-র একটি বিভাগ যা নিম্নোক্ত প্রয়োগের সাথে অন্যান্য উত্তরে প্রস্তাবিত:

- (void)addBordersToEdge:(UIRectEdge)edge withColor:(UIColor *)color andWidth:(CGFloat) borderWidth {
    if (edge & UIRectEdgeTop) {
        UIView *border = [UIView new];
        border.backgroundColor = color;
        [border setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin];
        border.frame = CGRectMake(0, 0, self.frame.size.width, borderWidth);
        [self addSubview:border];
    }

    if (edge & UIRectEdgeLeft) {
        UIView *border = [UIView new];
        border.backgroundColor = color;
        border.frame = CGRectMake(0, 0, borderWidth, self.frame.size.height);
        [border setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleRightMargin];
        [self addSubview:border];
    }

    if (edge & UIRectEdgeBottom) {
        UIView *border = [UIView new];
        border.backgroundColor = color;
        [border setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin];
        border.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, borderWidth);
        [self addSubview:border];
    }

    if (edge & UIRectEdgeRight) {
        UIView *border = [UIView new];
        border.backgroundColor = color;
        [border setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin];
        border.frame = CGRectMake(self.frame.size.width - borderWidth, 0, borderWidth, self.frame.size.height);
        [self addSubview:border];
    }
}

4

// মার্ক: - দেখার জন্য বাম সীমানা যুক্ত করুন

(void)prefix_addLeftBorder:(UIView *) viewName
{
    CALayer *leftBorder = [CALayer layer];
    leftBorder.backgroundColor = [UIColor colorWithRed:221/255.0f green:221/255.0f blue:221/255.0f alpha:1.0f].CGColor;
    leftBorder.frame = CGRectMake(0,0,1.0,viewName.frame.size.height);
    [viewName.layer addSublayer:leftBorder];
}

// মার্ক: - দেখার জন্য রাইটবোর্ডার যুক্ত করুন

(void)prefix_addRightBorder:(UIView *) viewName
{
    CALayer *rightBorder = [CALayer layer];
    rightBorder.backgroundColor = [UIColor colorWithRed:221/255.0f green:221/255.0f blue:221/255.0f alpha:1.0f].CGColor;
    rightBorder.frame = CGRectMake(viewName.frame.size.width - 1.0,0,1.0,viewName.frame.size.height);
    [viewName.layer addSublayer:rightBorder];
}

// মার্ক: - দেখার জন্য নীচে বর্ডার যুক্ত করুন

(void)prefix_addbottomBorder:(UIView *) viewName
{
    CALayer *bottomBorder = [CALayer layer];
    bottomBorder.backgroundColor = [UIColor colorWithRed:221/255.0f green:221/255.0f blue:221/255.0f alpha:1.0f].CGColor;
    bottomBorder.frame = CGRectMake(0,viewName.frame.size.height - 1.0,viewName.frame.size.width,1.0);
    [viewName.layer addSublayer:bottomBorder];
}

4

সুইফট 4.2 এবং অটোলআউট

আমি প্রস্তাবিত সমাধানগুলি দিয়ে গেলাম। অনেকগুলি ফ্রেমের উপর ভিত্তি করে তৈরি করা হয় এটি একটি সাধারণ এক্সটেনশন যা অটোলআউট সাথে কাজ করে - আমরা অটলাউট ব্যবহার করতে পারি তা নিশ্চিত করার জন্য স্তরটির পরিবর্তে ভিউ ব্যবহার করুন - 4 টি সীমাবদ্ধতার সাথে একক উপদর্শন

নিম্নলিখিত হিসাবে ব্যবহার করুন:

self.addBorder(.bottom, color: .lightGray, thickness: 0.5)


extension UIView {
    func addBorder(_ edge: UIRectEdge, color: UIColor, thickness: CGFloat) {
        let subview = UIView()
        subview.translatesAutoresizingMaskIntoConstraints = false
        subview.backgroundColor = color
        self.addSubview(subview)
        switch edge {
        case .top, .bottom:
            subview.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
            subview.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
            subview.heightAnchor.constraint(equalToConstant: thickness).isActive = true
            if edge == .top {
                subview.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
            } else {
                subview.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
            }
        case .left, .right:
            subview.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
            subview.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
            subview.widthAnchor.constraint(equalToConstant: thickness).isActive = true
            if edge == .left {
                subview.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
            } else {
                subview.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
            }
        default:
            break
        }
    }
}

3

আমি ড্যানের উত্তরে কিছু পরিবর্তন করেছি যাতে আমি একটি কমান্ড দিয়ে একাধিক প্রান্তে সীমানা যুক্ত করতে পারি:

infoView.addBorder(toEdges: [.left, .bottom, .right], color: borderColor, thickness: 1)

এখানে সম্পূর্ণ কোড:

extension UIView {
    func addBorder(toEdges edges: UIRectEdge, color: UIColor, thickness: CGFloat) {

        func addBorder(toEdge edges: UIRectEdge, color: UIColor, thickness: CGFloat) {
            let border = CALayer()
            border.backgroundColor = color.cgColor

            switch edges {
            case .top:
                border.frame = CGRect(x: 0, y: 0, width: frame.width, height: thickness)
            case .bottom:
                border.frame = CGRect(x: 0, y: frame.height - thickness, width: frame.width, height: thickness)
            case .left:
                border.frame = CGRect(x: 0, y: 0, width: thickness, height: frame.height)
            case .right:
                border.frame = CGRect(x: frame.width - thickness, y: 0, width: thickness, height: frame.height)
            default:
                break
            }

            layer.addSublayer(border)
        }

        if edges.contains(.top) || edges.contains(.all) {
            addBorder(toEdge: .top, color: color, thickness: thickness)
        }

        if edges.contains(.bottom) || edges.contains(.all) {
            addBorder(toEdge: .bottom, color: color, thickness: thickness)
        }

        if edges.contains(.left) || edges.contains(.all) {
            addBorder(toEdge: .left, color: color, thickness: thickness)
        }

        if edges.contains(.right) || edges.contains(.all) {
            addBorder(toEdge: .right, color: color, thickness: thickness)
        }
    }
}

2

এনএসবামের জবাব বন্ধ করে দিয়ে , আমি একটি অনুরূপ পন্থা নিয়েছি এবং এই সাধারণ ইউআইভিউ সাবক্লাসটি তৈরি করেছি যাতে এটি ইন্টারফেস বিল্ডারে কাজ করে এবং সীমাবদ্ধতার সাথে কাজ করে: গিথুব লিঙ্ক
সিজি কনটেক্সটফিলারেক্ট ব্যবহার করে সিজি কনটেক্সটস্ট্রোকপথের পরিবর্তে, আমি ভবিষ্যদ্বাণীগুলিকে সম্পূর্ণ দৃ solid় এবং ভিতরে রাখতে সক্ষম হয়েছি দেখার সীমানা।

এটি সম্পর্কে আমার ব্লগ পোস্টটি এখানে: http : //nat Microsoft.com/?p=55

- মূলত ইন্টারফেস বিল্ডারে একটি ইউআইভিউতে ফেলে দিন এবং তার শ্রেণীর ধরণটি NAUIViewWithB બોર્ડারে পরিবর্তন করুন।
- তারপরে আপনার ভিসির ভিউডিডলড এ জাতীয় কিছু করুন:

/* For a top border only ———————————————- */
self.myBorderView.borderColorTop = [UIColor redColor];
self.myBorderView..borderWidthsAll = 1.0f;

/* For borders with different colors and widths ————————— */
self.myBorderView.borderWidths = UIEdgeInsetsMake(2.0, 4.0, 6.0, 8.0);
self.myBorderView.borderColorTop = [UIColor blueColor];
self.myBorderView.borderColorRight = [UIColor redColor];
self.myBorderView.borderColorBottom = [UIColor greenColor];
self.myBorderView.borderColorLeft = [UIColor darkGrayColor];

এখানে .m ফাইলের প্রত্যক্ষ লিঙ্ক রয়েছে যাতে আপনি বাস্তবায়নটি দেখতে পারেন। পাশাপাশি একটি ডেমো প্রকল্প রয়েছে। আশা করি এটি কাউকে সাহায্য করবে :)


2

অনুরূপ প্রশ্নের আমার উত্তর: https://stackoverflow.com/a/27141956/435766 আমি ব্যক্তিগতভাবে সেটির উপরের বিভাগের রাস্তায় যেতে পছন্দ করি, যেহেতু আমি এটি ইউআইভিউর যে কোনও সাবক্লাসে ব্যবহার করতে সক্ষম হতে চাই।


2
extension UIView {

    func addBorder(edge: UIRectEdge, color: UIColor, borderWidth: CGFloat) {

        let seperator = UIView()
        self.addSubview(seperator)
        seperator.translatesAutoresizingMaskIntoConstraints = false

        seperator.backgroundColor = color

        if edge == .top || edge == .bottom
        {
            seperator.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0).isActive = true
            seperator.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
            seperator.heightAnchor.constraint(equalToConstant: borderWidth).isActive = true

            if edge == .top
            {
                seperator.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
            }
            else
            {
                seperator.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
            }
        }
        else if edge == .left || edge == .right
        {
            seperator.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
            seperator.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
            seperator.widthAnchor.constraint(equalToConstant: borderWidth).isActive = true

            if edge == .left
            {
                seperator.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0).isActive = true
            }
            else
            {
                seperator.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
            }
        }
    }

}

2

এখানে একটি সহজ সমাধান। আপনার উপর একটি লেবেল যুক্ত UIViewকরুন, লেবেলের পাঠ্যটি সাফ করুন এবং লেবেল ব্যাকগ্রাউন্ডের রঙটিকে আপনার সীমানার রঙ হিসাবে সেট করুন। মূল সেট (x,y)আপনার লেবেল উৎপত্তি হতে (x,y)আপনার ভিউ করুন। এবং আপনার প্রস্থ হিসাবে লেবেলের প্রস্থকে UIViewসেট করুন, উচ্চতাটি 1 বা 2 হিসাবে সেট করুন (আপনার শীর্ষে আপনার সীমানা উচ্চতার জন্য UIView)। এবং যে কৌশল করা উচিত।


28
তারপরে কোনও লেবেল রাখার কোনও অর্থ নেই, পাশাপাশি কেবল অন্য
ইউআইভিউ

1
এটি কোনও ইউভিউতে শীর্ষ শীর্ষ সীমানা যুক্ত করার প্রশ্নটির সত্যই উত্তর দেয় না। এটি একটি দ্রুত সমাধান যা সম্ভবত আরও জটিল সমস্যার জন্য কাজ করবে না।
সাইমন_স্মিলে


2

সুইফট 3 সংস্করণ

extension UIView {
    enum ViewSide {
        case Top, Bottom, Left, Right
    }

    func addBorder(toSide side: ViewSide, withColor color: UIColor, andThickness thickness: CGFloat) {

        let border = CALayer()
        border.backgroundColor = color.cgColor

        switch side {
        case .Top:
            border.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: thickness)
        case .Bottom:
            border.frame = CGRect(x: 0, y: frame.size.height - thickness, width: frame.size.width, height: thickness)
        case .Left:
            border.frame = CGRect(x: 0, y: 0, width: thickness, height: frame.size.height)
        case .Right:
            border.frame = CGRect(x: frame.size.width - thickness, y: 0, width: thickness, height: frame.size.height)
        }

        layer.addSublayer(border)
    }
}

সংশ্লিষ্ট সীমানা সেট করতে আপনার ডাইডলয়আউটসুভিউগুলি () পদ্ধতিটি ওভাররাইড করা উচিত :

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    yourView.addBorder(toSide: UIView.ViewSide.Top, withColor: UIColor.lightGray, andThickness: 1)

লেআউট আপডেট পাবেন যখনই এটি 'অ্যাডসবলার' কল করবে?
জীবন

1

সীমানা যুক্ত করার সন্ধানে কাউকে সহায়তা করার জন্য এখানে কেবল পোস্ট করা। আমি স্বীকৃত উত্তরে এখানে কয়েকটি পরিবর্তন করেছি এখানে কেবল সুইফট লেবেলটি বাম সীমান্ত । ক্ষেত্রে প্রস্থ পরিবর্তিত UIRectEdge.Topথেকে CGRectGetHeight(self.frame)থেকে CGRectGetWidth(self.frame)এবং ক্ষেত্রে UIRectEdge.Bottomথেকে UIScreen.mainScreen().bounds.widthকরতে CGRectGetWidth(self.frame)সীমানা সঠিকভাবে জন্য। সুইফট 2 ব্যবহার করা।

শেষ পর্যন্ত এক্সটেনশনটি হ'ল:

extension CALayer {

func addBorder(edge: UIRectEdge, color: UIColor, thickness: CGFloat) {

    let border = CALayer();

    switch edge {
    case UIRectEdge.Top:
        border.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), thickness); 
        break
    case UIRectEdge.Bottom:
        border.frame = CGRectMake(0, CGRectGetHeight(self.frame) - thickness, CGRectGetWidth(self.frame), thickness)
        break
    case UIRectEdge.Left:
        border.frame = CGRectMake(0, 0, thickness, CGRectGetHeight(self.frame))
        break
    case UIRectEdge.Right:
        border.frame = CGRectMake(CGRectGetWidth(self.frame) - thickness, 0, thickness, CGRectGetHeight(self.frame))
        break
    default:
        break
    }

    border.backgroundColor = color.CGColor;

    self.addSublayer(border)
}

}

1

যদি কারও কাছে কখনও জামারিন সংস্করণ প্রয়োজন হয়:

public static class UIUtils
{
    public static void AddBorder(this CALayer cALayer, UIRectEdge edge, UIColor color, float thickness)
    {

        var border = new CALayer();
        switch (edge) 
        {
            case UIRectEdge.Top:
                border.Frame = new CGRect(0, 0, cALayer.Frame.Width, height: thickness);
                break;
            case UIRectEdge.Bottom:
                border.Frame = new CGRect(0, cALayer.Frame.Height - thickness, width: cALayer.Frame.Width, height: thickness);
                break;
            case UIRectEdge.Left:
                border.Frame = new CGRect(0, 0, width: thickness, height: cALayer.Frame.Height);
                break;
            case UIRectEdge.Right:
                border.Frame = new CGRect(cALayer.Frame.Width - thickness, y: 0, width: thickness, height: cALayer.Frame.Height);
                break;
            default: break;
        }
        border.BackgroundColor = color.CGColor;
        cALayer.AddSublayer(border);
    }
}

1

পলসের উত্তরের একটি সুইফট 4 সংস্করণ এখানে

func addTopBorder(color: UIColor, thickness: CGFloat) {
    let border = UIView()
    border.backgroundColor = color
    border.autoresizingMask = [.flexibleWidth, .flexibleBottomMargin]
    border.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: thickness)
    addSubview(border)
}

func addBottomBorder(color: UIColor, thickness: CGFloat) {
    let border = UIView()
    border.backgroundColor = color
    border.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
    border.frame = CGRect(x: 0, y: frame.size.height - thickness, width: frame.size.width, height: thickness)
    addSubview(border)
}

func addLeftBorder(color: UIColor, thickness: CGFloat) {
    let border = UIView()
    border.backgroundColor = color
    border.autoresizingMask = [.flexibleHeight, .flexibleRightMargin]
    border.frame = CGRect(x: 0, y: 0, width: thickness, height: frame.size.height)
    addSubview(border)
}

func addRightBorder(color: UIColor, thickness: CGFloat) {
    let border = UIView()
    border.backgroundColor = color
    border.autoresizingMask = [.flexibleHeight, .flexibleLeftMargin]
    border.frame = CGRect(x: frame.size.width - thickness, y: 0, width: thickness, height: frame.size.height)
    addSubview(border)
}

1

@ অ্যাডিসন দ্বারা অনুপ্রাণিত হয়ে আমি তৃতীয় পক্ষের কোনও কাঠামো ব্যবহার না করেই এক্সটেনশনটি আবার লিখেছি, কারণ তিনি স্ন্যাপকিট এবং কোকো লাম্বারজ্যাক ব্যবহার করেছিলেন।

@ অ্যাডিজনস পদ্ধতির মতো আমি পূর্বে যুক্ত হওয়া সীমানাগুলিও সরিয়ে দিচ্ছি, সুতরাং এই বাস্তবায়নটি টেবিল সেল এবং সংগ্রহের ঘর হিসাবে পুনরায় ব্যবহারযোগ্য দৃশ্যের সাথে দুর্দান্ত খেলতে হবে।

fileprivate class BorderView: UIView {} // dummy class to help us differentiate among border views and other views
                                        // to enabling us to remove existing borders and place new ones

extension UIView {

    func setBorders(toEdges edges: [UIRectEdge], withColor color: UIColor, inset: CGFloat = 0, thickness: CGFloat) {
        // Remove existing edges
        for view in subviews {
            if view is BorderView {
                view.removeFromSuperview()
            }
        }
        // Add new edges
        if edges.contains(.all) {
            addSidedBorder(toEdge: [.left,.right, .top, .bottom], withColor: color, inset: inset, thickness: thickness)
        }
        if edges.contains(.left) {
            addSidedBorder(toEdge: [.left], withColor: color, inset: inset, thickness: thickness)
        }
        if edges.contains(.right) {
            addSidedBorder(toEdge: [.right], withColor: color, inset: inset, thickness: thickness)
        }
        if edges.contains(.top) {
            addSidedBorder(toEdge: [.top], withColor: color, inset: inset, thickness: thickness)
        }
        if edges.contains(.bottom) {
            addSidedBorder(toEdge: [.bottom], withColor: color, inset: inset, thickness: thickness)
        }
    }

    private func addSidedBorder(toEdge edges: [RectangularEdges], withColor color: UIColor, inset: CGFloat = 0, thickness: CGFloat) {
        for edge in edges {
            let border = BorderView(frame: .zero)
            border.backgroundColor = color
            addSubview(border)
            border.translatesAutoresizingMaskIntoConstraints = false
            switch edge {
            case .left:
                NSLayoutConstraint.activate([
                border.leftAnchor.constraint(equalTo: self.leftAnchor, constant: inset),
                    border.topAnchor.constraint(equalTo: self.topAnchor, constant: inset),
                    border.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -inset),
                    NSLayoutConstraint(item: border, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .width, multiplier: 1, constant: thickness) ])
            case .right:
                NSLayoutConstraint.activate([
                    border.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -inset),
                    border.topAnchor.constraint(equalTo: self.topAnchor, constant: inset),
                    border.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -inset),
                    NSLayoutConstraint(item: border, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .width, multiplier: 1, constant: thickness) ])
            case .top:
                NSLayoutConstraint.activate([
                    border.leftAnchor.constraint(equalTo: self.leftAnchor, constant: inset),
                    border.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -inset),
                    border.topAnchor.constraint(equalTo: self.topAnchor, constant: inset),
                    NSLayoutConstraint(item: border, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: thickness) ])
            case .bottom:
                NSLayoutConstraint.activate([
                    border.leftAnchor.constraint(equalTo: self.leftAnchor, constant: inset),
                    border.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -inset),
                    border.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -inset),
                    NSLayoutConstraint(item: border, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1, constant: thickness) ])
            }
        }
    }

    private enum RectangularEdges {
        case left
        case right
        case top
        case bottom
    }
}

1

যদি আমি স্টোরিবোর্ডের মধ্যে থেকে বিল্ডিং করি তবে আমি আমার দরকারীগুলির UIViewপিছনে একটি যুক্ত করা পছন্দ করি UIView... যদি আমি আমার শীর্ষে একটি সীমানা তৈরি করতে চাই UIView, তবে আমি কেবল UIViewআমার সীমানা প্রস্থের মাধ্যমে পটভূমির উচ্চতা বাড়িয়ে তুলি ... একই অন্য কোনও পক্ষের জন্য করা :)


0

ব্যক্তিগতভাবে আমি ভিউ + ড্রআরেক্টের উপ-শ্রেণিবদ্ধকরণ পছন্দ করি তবে এখানে এটি সম্পর্কে আরও একটি উপায় রয়েছে (এবং এটি @ পোলাভিথের গৃহীত উত্তরের মতো একই লাইনের সাথে কাজ করে):

আপনার পছন্দসই মাত্রা পছন্দ করতে আপনার নতুন সীমানা স্তরটি সেট আপ করা যেতে পারে। সুতরাং, যদি পোলাভিথের উত্তরের মতো, আপনি একটি স্তরটি যতটা লম্বা হতে চান তত লম্বা হতে পারেন এবং আপনি যে দৃশ্যের সীমানা রাখতে চান তার মতো প্রশস্ত। আপনি যেখানে চান সেখানে এটি স্থাপনের জন্য স্তরটির ফ্রেম সংজ্ঞাটি ব্যবহার করুন এবং তারপরে এটিকে আপনার দৃশ্যে একটি উপ-স্তর হিসাবে যুক্ত করুন।

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

    CALayer *leftBorder = [CALayer layer];
leftBorder.borderColor = [UIColor colorWithRed:0.0 green:91.0/255.0 blue:141.0/255.0 alpha:1.0].CGColor;
leftBorder.borderWidth = 1;
leftBorder.frame = CGRectMake(0, 0, 1.0, CGRectGetHeight(self.myTargetView.frame));
[self.myTargetView.layer addSublayer:leftBorder];

আমি এটির মধ্য দিয়ে একমাত্র মধ্যপন্থী সুবিধা অনুমান করি এবং একটি ছোট ইউআইভিউ বা ইউআইএলবেল তৈরি করাই হ'ল কলায়ার অনুমিতভাবে 'হালকা-ওজন' বলে মনে করেন এবং ক্যালায়ার্স ব্যবহার করে ওভার-রাইডিং ড্রয়ারেক্ট বনাম সম্পর্কে অনেক মজার মতামত রয়েছে (মতামত হিসাবে) : আইওএস: ইউআইভিউ'র 'ড্রয়রেক্ট:' বনাম এর স্তরটির ডেলাগেট 'ড্রলায়ার: ইনকন্টেক্সট:' ) ব্যবহার করছে।

Animal451

আমি নীল রঙ পছন্দ করি।


0

N8tr এর পাশাপাশি স্টোরিবোর্ড থেকে সেগুলি সেট করার একটি উপলব্ধতা রয়েছে তা যুক্ত করতে পারে:
- .h ফাইলের মতো borderColorএবং দুটি বৈশিষ্ট্য যুক্ত borderWidthকরুন;
- তারপরে আপনি keyPathsস্টোরিবোর্ডে সরাসরি যুক্ত করতে পারেন, স্ক্রিনশটের লিঙ্কটি দেখতে পারেন


0

ড্যানশেভ উত্তরটি সুইফ্ট 3-এ রূপান্তর করুন

extension CALayer {

func addBorder(edge: UIRectEdge, color: UIColor, thickness: CGFloat) {

    let border = CALayer()

    switch edge {
    case .top:
        border.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: thickness)
        break
    case .bottom:
        border.frame = CGRect(x: 0, y: self.frame.height - thickness, width: self.frame.width, height: thickness)
        break
    case .left:
        border.frame = CGRect(x: 0, y: 0, width: thickness, height: self.frame.height)
        break
    case .right:
        border.frame = CGRect(x: self.frame.width - thickness, y: 0, width: thickness, height: self.frame.height)
        break
    default:
        break
    }

    border.backgroundColor = color.cgColor;

    self.addSublayer(border)
}
}

0

সি # তে জামারিনের জন্য আমি সাব স্তরটি যুক্ত করার সময় কেবল সীমানার ইনলাইন তৈরি করি

  View.Layer.AddSublayer(new CALayer()
    {
        BackgroundColor = UIColor.Black.CGColor,
        Frame = new CGRect(0, 0, View.Frame.Width, 0.5f)
    });

আপনি নীচে, বাম এবং ডান সীমান্তের জন্য এটি (অন্যদের পরামর্শ অনুযায়ী) ব্যবস্থা করতে পারেন।


0

আপনি ইউআইকিট এবং ফাউন্ডেশন বিভাগগুলির এই সংগ্রহটিও দেখতে পারেন: https://github.com/leszek-s/LS বিভাগ

এটি কোডের একক লাইনের সাথে ইউআইভিউয়ের একপাশে সীমানা যুক্ত করার অনুমতি দেয়:

[self.someView lsAddBorderOnEdge:UIRectEdgeTop color:[UIColor blueColor] width:2];

এবং এটি সঠিকভাবে দর্শন ঘূর্ণন পরিচালনা করে যখন বেশিরভাগ এখানে পোস্ট করা উত্তরগুলি এটি ভালভাবে পরিচালনা করে না।


0

দ্রষ্টব্য: এখানে বেশিরভাগ সমাধান অভিযোজিত নয় এবং আকার পরিবর্তন করবে না। যে আকারগুলি পুনরায় আকার দেবে তা আপনার সূচনাকালীন সময়ে ব্যাপক প্রভাব ফেলবে কারণ তারা প্রচুর সিপিইউ ব্যবহার করে।

আপনি এই সমাধানটি নীচে ব্যবহার করতে পারেন। এটি ইউআইবিজেয়ারপ্যাথগুলিতে কাজ করে যা স্তরগুলির চেয়ে হালকা, দ্রুত প্রারম্ভকালীন সময় সৃষ্টি করে। এটি ব্যবহার করা সহজ, নীচে নির্দেশাবলী দেখুন।

class ResizeBorderView: UIView {
    var color = UIColor.white
    var lineWidth: CGFloat = 1
    var edges = [UIRectEdge](){
        didSet {
            setNeedsDisplay()
        }
    }
    override func draw(_ rect: CGRect) {
        if edges.contains(.top) || edges.contains(.all){
            let path = UIBezierPath()
            path.lineWidth = lineWidth
            color.setStroke()
            UIColor.blue.setFill()
            path.move(to: CGPoint(x: 0, y: 0 + lineWidth / 2))
            path.addLine(to: CGPoint(x: self.bounds.width, y: 0 + lineWidth / 2))
            path.stroke()
        }
        if edges.contains(.bottom) || edges.contains(.all){
            let path = UIBezierPath()
            path.lineWidth = lineWidth
            color.setStroke()
            UIColor.blue.setFill()
            path.move(to: CGPoint(x: 0, y: self.bounds.height - lineWidth / 2))
            path.addLine(to: CGPoint(x: self.bounds.width, y: self.bounds.height - lineWidth / 2))
            path.stroke()
        }
        if edges.contains(.left) || edges.contains(.all){
            let path = UIBezierPath()
            path.lineWidth = lineWidth
            color.setStroke()
            UIColor.blue.setFill()
            path.move(to: CGPoint(x: 0 + lineWidth / 2, y: 0))
            path.addLine(to: CGPoint(x: 0 + lineWidth / 2, y: self.bounds.height))
            path.stroke()
        }
        if edges.contains(.right) || edges.contains(.all){
            let path = UIBezierPath()
            path.lineWidth = lineWidth
            color.setStroke()
            UIColor.blue.setFill()
            path.move(to: CGPoint(x: self.bounds.width - lineWidth / 2, y: 0))
            path.addLine(to: CGPoint(x: self.bounds.width - lineWidth / 2, y: self.bounds.height))
            path.stroke()
        }
    }
}
  1. আপনার ইউআইভিউয়ের শ্রেণিটি পুনরায় আকারবর্ডারভিউতে সেট করুন
  2. আপনার ভিউডিডিঅ্যাপার পদ্ধতিতে আপনার ভিউ.કોলর এবং আপনার ভিউ.লাইনউথের সাহায্যে রঙ এবং রেখার প্রস্থ নির্ধারণ করুন
  3. প্রান্তগুলি সেট করুন, উদাহরণস্বরূপ: আপনার ভিউ.জেডস = [। ডান,। বাম] ([। সমস্ত]) সকলের জন্য
  4. দ্রুত শুরু এবং পুনরায় আকারের সীমানাগুলি উপভোগ করুন

0

সুইফটে একটি ইউআইভিউয়ের জন্য শীর্ষ সীমানা এবং নীচে বর্ডার সেট করার জন্য।

let topBorder = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 1))
topBorder.backgroundColor = UIColor.black
myView.addSubview(topBorder)

let bottomBorder = UIView(frame: CGRect(x: 0, y: myView.frame.size.height - 1, width: 10, height: 1))
bottomBorder.backgroundColor = UIColor.black
myView.addSubview(bottomBorder)

0

সুইফট 4 এবং 3 এ

let borderThickness = 2
let topBorder = UIView()
topBorder.backgroundColor = UIColor.red
topBorder.frame = CGRect(x: 0, y: 0, width: 
                  Int(yourViewFromOutlet.frame.size.width), height: 
                  borderThickness)
yourViewFromOutlet.addSubview(topBorder)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.