在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中提供它,但他可能需要一些时间来回应。我发布它的目的是,我只想在这里找到更快的解决方案。
问候!
答案 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