1 bounds和frames的區(qū)別
bounds是相對(duì)于自身坐標(biāo)系來說的位置和尺寸艾猜,并且origin一般為(0宙橱,0)
frame是相對(duì)于父視圖坐標(biāo)系來說自己的位置和尺寸
對(duì)于一個(gè)UIView實(shí)例subview,改變view的bounds并不會(huì)改變它在superview中的位置
view.bounds.origin = CGPoint.init(x:0,y:0)
view.bounds.origin = CGPoint.init(x:10,y:0)
在superview中的位置有啥區(qū)別?
對(duì)于frame來說柬祠,其在superview中的位置北戏,計(jì)算公式如下:
let subview =UIView.init(frame:CGRect.init(x:20, y:20, width:10, height:10))
其在superview中的位置一定在(20,20)嗎?
frame的計(jì)算公式:
subview.frame.origin.x =?subview.frame.origin.x - superview.bounds.origin.x
subview.frame.origin.y =?subview.frame.origin.y - superview.bounds.origin.y
//
2簡(jiǎn)單實(shí)現(xiàn)scrollView
基于上面對(duì)bounds和frames的理解漫蛔,簡(jiǎn)單實(shí)現(xiàn)了scrollView
1創(chuàng)建繼承自UIView的view
class CJScrollView:UIView{
}
2模擬滑動(dòng)手勢(shì)
let panGesture =UIPanGestureRecognizer.init(target:self, action:#selector(panGestureAction(pan:)))
? ? ? ? self.addGestureRecognizer(panGesture)
letpanGesture =UIPanGestureRecognizer.init(target:self, action:#selector(panGestureAction(pan:)))
? ? ? ? self.addGestureRecognizer(panGesture)
3:在手勢(shì)中進(jìn)行判斷(核心代碼)
ifpan.state== .began{
? ? ? ? ? ? startLocation=self.bounds.origin
? ? ? ? ? ? NSLog("\(startLocation)")
? ? ? ? }
? ? ? ? ifpan.state== .changed{
? ? ? ? ? ? letpoint = pan.translation(in:self)
? ? ? ? ? ? NSLog("\(point)")
? ? ? ? ? ? varnewOriginX =self.startLocation.x- point.x
? ? ? ? ? ? varnewOriginY =self.startLocation.y- point.y
? ? ? ? ? ? //
? ? ? ? ? ? ifnewOriginX <0{
? ? ? ? ? ? ? ? newOriginX =0
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? letmaxMoveWidth =contentSize.width-self.bounds.width
? ? ? ? ? ? ? ? ifnewOriginX > maxMoveWidth{
? ? ? ? ? ? ? ? ? ? newOriginX = maxMoveWidth
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? ifnewOriginY <0{
? ? ? ? ? ? ? ? newOriginY =0
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? letmaxMoveHeight =contentSize.height-self.bounds.height
? ? ? ? ? ? ? ? ifnewOriginY > maxMoveHeight{
? ? ? ? ? ? ? ? ? ? newOriginY = maxMoveHeight
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? varbounds =self.bounds
? ? ? ? ? ? bounds.origin=CGPoint.init(x:newOriginX, y:newOriginY)
? ? ? ? ? ? self.bounds= bounds
? ? ? ? }
Demo:https://github.com/caoxijian/ScrollViewTest