

Notes
1.Redraw
画一个圆之后,如果将手机从正常换为landscape,圆会变成椭圆,需要将view的content mode 改为Redraw,这样在改变bound的时候,就会重绘。
override func draw(_ rect: CGRect) {
// Solution 1
if let context = UIGraphicsGetCurrentContext() {
context.addArc(center: CGPoint(x: bounds.midX, y: bounds.midY), radius: 100.0, startAngle: 0, endAngle: 2*CGFloat.pi, clockwise: true)
context.setLineWidth(5.0)
UIColor.green.setFill()
UIColor.red.setStroke()
context.strokePath()
context.fillPath()
}
// Solution 2
let path = UIBezierPath()
path.addArc(withCenter: CGPoint(x: bounds.midX, y: bounds.midY), radius: 100.0, startAngle: 0, endAngle: 2*CGFloat.pi, clockwise: true)
path.lineWidth = 5.0
UIColor.green.setFill()
UIColor.red.setStroke()
path.stroke()
path.fill()
}



2.居中且随着系统字体大小改变的字体

private func centeredAttributedString(_ string: String, fontsize: CGFloat) -> NSAttributedString {
var font = UIFont.preferredFont(forTextStyle: .body).withSize(fontsize)
font = UIFontMetrics(forTextStyle: .body).scaledFont(for: font)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
return NSAttributedString(string: string, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle, NSAttributedString.Key.font: font])
}
3. layoutSubviews()
用于subview的布局。当subview的bounds改变时,会由系统调用layoutSubviews()
里的代码。
layoutSubviews()
由系统调用,如果你想要调用它,调用setNeedsLayout()
,然后系统最终会调用layoutSubviews()
。
如果你调用setNeedsDisplay()
,系统最终会调用draw()
4.label.sizeToFit()
它会调整标签的大小以适应其内容。但是如果该lable已经有了宽度,调用sizeToFit()
,会使label变的更高,所以要先调用label.frame.size = CGSize.zero
。在做sizeToFit之前先清除它的大小。
lable.frame.size = CGSize.zero
lable.sizeToFit()
5.traitCollectionDidchange()
当调整字体大小的滑块变化时,会调用这个方法,当系统字体大小改变时,需要在这个方法里调用setNeedsDisplay()
和setNeesdLayout()
从而改变view里字体的大小,以及重新调整布局。
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
setNeedsDisplay()
setNeedsLayout()
}
6.@IBDesignable 和 @IBInspectable
在class前面加上@IBDesignable可以直接在InterfaceBuiler中编译显示。
import UIKit
@IBDesignable
class PlayingCardView: UIView {
}
7.为UIView添加一个 gesture recognizer
Image we wanted a UIView in our Controller's view to recognize a "pan" gesture.
we can configure it to do so in the property observer for the outlet to that UIView...
@IBOutlet weak var pannableView: UIView {
didSet {
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panAction(recognizer:)))
pannableView.addGestureRecognizer(panGestureRecognizer)
}
}
@objc func panAction(recognizer: UIPanGestureRecognizer) {
switch recognizer.state {
case .changed: fallthrough
case .ended:
let translation = recognizer.translation(in: pannableView)
// update
recognizer.setTranslation(CGPoint.zero, in: pannableView)
default:
break
}
}
8.通过InterfaceBuilder添加tap手势
1.给view添加一个tapGesture

2.为tapGesture添加Action

@IBAction func FlipCard(_ sender: UIPanGestureRecognizer) {
switch sender.state {
case .ended:
playingCardView.isFacedUp = !playingCardView.isFacedUp
default:
break
}
}
网友评论