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

在Swift中find一个解决scheme: 如何在UIView的顶端添加边框

在Objective-C中需要它。 所以我可能需要挖掘斯威夫特为了转换它,但我还没有学到斯威夫特呢。

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 } 

PS我已经要求原答复者在Objective-C中提供它,但他可能需要一些时间来回应。 我的目的是发布它,我只是想在这里快一点的解决scheme。

问候!

这应该工作。 在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