CropOverlay.swift
4.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//
// CropOverlay.swift
// ALCameraViewController
//
// Created by Alex Littlejohn on 2015/06/30.
// Copyright (c) 2015 zero. All rights reserved.
//
import UIKit
internal class CropOverlay: UIView {
var outerLines = [UIView]()
var horizontalLines = [UIView]()
var verticalLines = [UIView]()
var topLeftCornerLines = [UIView]()
var topRightCornerLines = [UIView]()
var bottomLeftCornerLines = [UIView]()
var bottomRightCornerLines = [UIView]()
let cornerDepth: CGFloat = 3
let cornerWidth: CGFloat = 20
let lineWidth: CGFloat = 1
internal init() {
super.init(frame: CGRect.zero)
createLines()
}
internal override init(frame: CGRect) {
super.init(frame: frame)
createLines()
}
internal required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
createLines()
}
override func layoutSubviews() {
for i in 0..<outerLines.count {
let line = outerLines[i]
var lineFrame: CGRect
switch (i) {
case 0:
lineFrame = CGRect(x: 0, y: 0, width: bounds.width, height: lineWidth)
break
case 1:
lineFrame = CGRect(x: bounds.width - lineWidth, y: 0, width: lineWidth, height: bounds.height)
break
case 2:
lineFrame = CGRect(x: 0, y: bounds.height - lineWidth, width: bounds.width, height: lineWidth)
break
case 3:
lineFrame = CGRect(x: 0, y: 0, width: lineWidth, height: bounds.height)
break
default:
lineFrame = CGRect.zero
break
}
line.frame = lineFrame
}
let corners = [topLeftCornerLines, topRightCornerLines, bottomLeftCornerLines, bottomRightCornerLines]
for i in 0..<corners.count {
let corner = corners[i]
var horizontalFrame: CGRect
var verticalFrame: CGRect
switch (i) {
case 0:
verticalFrame = CGRect(x: -cornerDepth, y: -cornerDepth, width: cornerDepth, height: cornerWidth)
horizontalFrame = CGRect(x: -cornerDepth, y: -cornerDepth, width: cornerWidth, height: cornerDepth)
break
case 1:
verticalFrame = CGRect(x: bounds.width, y: -cornerDepth, width: cornerDepth, height: cornerWidth)
horizontalFrame = CGRect(x: bounds.width + cornerDepth - cornerWidth, y: -cornerDepth, width: cornerWidth, height: cornerDepth)
break
case 2:
verticalFrame = CGRect(x: -cornerDepth, y: bounds.height + cornerDepth - cornerWidth, width: cornerDepth, height: cornerWidth)
horizontalFrame = CGRect(x: -cornerDepth, y: bounds.height, width: cornerWidth, height: cornerDepth)
break
case 3:
verticalFrame = CGRect(x: bounds.width, y: bounds.height + cornerDepth - cornerWidth, width: cornerDepth, height: cornerWidth)
horizontalFrame = CGRect(x: bounds.width + cornerDepth - cornerWidth, y: bounds.height, width: cornerWidth, height: cornerDepth)
break
default:
verticalFrame = CGRect.zero
horizontalFrame = CGRect.zero
break
}
corner[0].frame = verticalFrame
corner[1].frame = horizontalFrame
}
let lineThickness = lineWidth / UIScreen.main.scale
let padding = (bounds.height - (lineThickness * CGFloat(horizontalLines.count))) / CGFloat(horizontalLines.count + 1)
for i in 0..<horizontalLines.count {
let hLine = horizontalLines[i]
let vLine = verticalLines[i]
let spacing = (padding * CGFloat(i + 1)) + (lineThickness * CGFloat(i))
hLine.frame = CGRect(x: 0, y: spacing, width: bounds.width, height: lineThickness)
vLine.frame = CGRect(x: spacing, y: 0, width: lineThickness, height: bounds.height)
}
}
func createLines() {
outerLines = [createLine(), createLine(), createLine(), createLine()]
horizontalLines = [createLine(), createLine()]
verticalLines = [createLine(), createLine()]
topLeftCornerLines = [createLine(), createLine()]
topRightCornerLines = [createLine(), createLine()]
bottomLeftCornerLines = [createLine(), createLine()]
bottomRightCornerLines = [createLine(), createLine()]
isUserInteractionEnabled = false
}
func createLine() -> UIView {
let line = UIView()
line.backgroundColor = UIColor.white
addSubview(line)
return line
}
}