使用自动布局向UIView添加特定边框

时间:2015-12-29 08:59:12

标签: ios objective-c

在Swift中找到解决方案:How to add a border just on the top side of a UIView

在Objective-C中需要它。所以我可能需要Dig Swift来转换它,但我还没有学过Swift。

Swift代码:

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
}

P.S - 我已经要求原始的回答者在Objective-C中提供它,但他可能需要一些时间来回应。我发布它的目的是,我只想在这里找到更快的解决方案。

问候!

1 个答案:

答案 0 :(得分:1)

这应该有效。在UIView上创建一个类别,然后就可以像这样使用它:

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

下面是该类别:

<强>·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