简体   繁体   中英

Add Specific Border to UIView with Auto-Layout

Found a solution here in Swift: How to add a border just on the top side of a UIView

Need it in Objective-C. So I may have to Dig Swift in order to convert it and but I have not learned Swift yet.

Swift Code :

func addBorder(edges edges: UIRectEdge, colour: UIColor = UIColor.whiteColor(), thickness: CGFloat = 1) -> [UIView] {

    var borders = [UIView]()

    func border() -> UIView {
        let border = UIView(frame: CGRectZero)
        border.backgroundColor = colour
        border.translatesAutoresizingMaskIntoConstraints = false
        return border
    }

    if edges.contains(.Top) || edges.contains(.All) {
        let top = border()
        addSubview(top)
        addConstraints(
                       NSLayoutConstraint.constraintsWithVisualFormat("V:|-(0)-[top(==thickness)]",
                                                                      options: [],
                                                                      metrics: ["thickness": thickness],
                                                                      views: ["top": top]))
        addConstraints(
                       NSLayoutConstraint.constraintsWithVisualFormat("H:|-(0)-[top]-(0)-|",
                                                                      options: [],
                                                                      metrics: nil,
                                                                      views: ["top": top]))
        borders.append(top)
    }

    if edges.contains(.Left) || edges.contains(.All) {
        let left = border()
        addSubview(left)
        addConstraints(
                       NSLayoutConstraint.constraintsWithVisualFormat("H:|-(0)-[left(==thickness)]",
                                                                      options: [],
                                                                      metrics: ["thickness": thickness],
                                                                      views: ["left": left]))
        addConstraints(
                       NSLayoutConstraint.constraintsWithVisualFormat("V:|-(0)-[left]-(0)-|",
                                                                      options: [],
                                                                      metrics: nil,
                                                                      views: ["left": left]))
        borders.append(left)
    }

    if edges.contains(.Right) || edges.contains(.All) {
        let right = border()
        addSubview(right)
        addConstraints(
                       NSLayoutConstraint.constraintsWithVisualFormat("H:[right(==thickness)]-(0)-|",
                                                                      options: [],
                                                                      metrics: ["thickness": thickness],
                                                                      views: ["right": right]))
        addConstraints(
                       NSLayoutConstraint.constraintsWithVisualFormat("V:|-(0)-[right]-(0)-|",
                                                                      options: [],
                                                                      metrics: nil,
                                                                      views: ["right": right]))
        borders.append(right)
    }

    if edges.contains(.Bottom) || edges.contains(.All) {
        let bottom = border()
        addSubview(bottom)
        addConstraints(
                       NSLayoutConstraint.constraintsWithVisualFormat("V:[bottom(==thickness)]-(0)-|",
                                                                      options: [],
                                                                      metrics: ["thickness": thickness],
                                                                      views: ["bottom": bottom]))
        addConstraints(
                       NSLayoutConstraint.constraintsWithVisualFormat("H:|-(0)-[bottom]-(0)-|",
                                                                      options: [],
                                                                      metrics: nil,
                                                                      views: ["bottom": bottom]))
        borders.append(bottom)
    }

    return borders
}

PS - I have asked the original answerer to provide it in Objective-C, but he may take sometime to respond. My Purpose to post it is that, I just want a bit quicker solution here.

Regards!

This should work. Make a category on UIView then you can use it like this:

[self.scrollView addAutolayoutBorder:UIRectEdgeLeft | UIRectEdgeRight | UIRectEdgeBottom
                              colour:[UIColor redColor]
                           thickness:2.0f];

Heres the category:

.h

#import <UIKit/UIKit.h>

@interface UIView (AutoLayoutBorder) {

}

- (NSMutableArray *)addAutolayoutBorder:(UIRectEdge)edges
                                 colour:(UIColor *)colour
                              thickness:(CGFloat)thickness;

@end

.m

#import "UIView+AutoLayoutBorder.h"

@implementation UIView (AutoLayoutBorder)

- (NSMutableArray *)addAutolayoutBorder:(UIRectEdge)edges
                                 colour:(UIColor *)colour
                              thickness:(CGFloat)thickness {

    NSMutableArray *borderViewsArray = [NSMutableArray new];

    UIView * (^getBorder)(void) = ^UIView *{
        UIView *borderView = [UIView new];
        borderView.translatesAutoresizingMaskIntoConstraints = NO;
        borderView.backgroundColor = colour;
        return borderView;
    };

    if ((edges & UIRectEdgeTop) == UIRectEdgeTop  || (edges & UIRectEdgeAll) == UIRectEdgeAll) {
        UIView *top = getBorder();
        [self addSubview:top];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[top(==thickness)]"
                                                                    options:0
                                                                    metrics:@{@"thickness" : @(thickness)}
                                                                      views:@{@"top" : top}]];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[top]-(0)-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:@{@"top" : top}]];
        [borderViewsArray addObject:top];
    }

    if ((edges & UIRectEdgeLeft) == UIRectEdgeLeft || (edges & UIRectEdgeAll) == UIRectEdgeAll) {
        UIView *left = getBorder();
        [self addSubview:left];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[left(==thickness)]"
                                                                     options:0
                                                                     metrics:@{@"thickness" : @(thickness)}
                                                                       views:@{@"left" : left}]];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[left]-(0)-|"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:@{@"left" : left}]];
        [borderViewsArray addObject:left];
    }

    if ((edges & UIRectEdgeRight) == UIRectEdgeRight || (edges & UIRectEdgeAll) == UIRectEdgeAll) {
        UIView *right = getBorder();
        [self addSubview:right];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[right(==thickness)]-(0)-|"
                                                                      options:0
                                                                      metrics:@{@"thickness" : @(thickness)}
                                                                        views:@{@"right" : right}]];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[right]-(0)-|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:@{@"right" : right}]];
        [borderViewsArray addObject:right];
    }

    if ((edges & UIRectEdgeBottom) == UIRectEdgeBottom || (edges & UIRectEdgeAll) == UIRectEdgeAll) {
        UIView *bottom = getBorder();
        [self addSubview:bottom];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[bottom(==thickness)]-(0)-|"
                                                                       options:0
                                                                       metrics:@{@"thickness" : @(thickness)}
                                                                         views:@{@"bottom" : bottom}]];

        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[bottom]-(0)-|"
                                                                       options:0
                                                                       metrics:nil
                                                                         views:@{@"bottom" : bottom}]];
        [borderViewsArray addObject:bottom];
    }

    return borderViewsArray;
}

@end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM