如何获取UIImageView的边缘以捕捉到屏幕边缘(超级视图)?
问题描述:
我不希望任何人为我编写代码。我只是在朝着框架和/或使用方法的正确方向寻求推动。我想要做的是,在iOS Swift中,允许用户选择一张照片并将其放置在屏幕上。我已经有那部分工作。我也有它的工作,你可以通过拖动图像来定位它,并捏合使其变大或变小。然而,“棘手”的部分是以下...当边缘(或边缘)接近超级视图(屏幕)的框架时,我希望ImageView能够“捕捉”到边缘的位置。基本上,我希望图像的边缘被“磁性”吸引到屏幕的边缘。我不太确定哪种方法组合最适合完成这一点。任何建议感激。如何获取UIImageView的边缘以捕捉到屏幕边缘(超级视图)?
编辑: 这里是我迄今为止...
class AdjustableImageView: UIImageView {
var parent:ViewController!
// last location for view
var lastSavedLocation = CGPointZero
override init(frame: CGRect) {
super.init(frame: frame)
// add pan gesture to view
let panGesture = UIPanGestureRecognizer(target: self, action: "handlePanGesture:")
let longPressGesture = UILongPressGestureRecognizer(target: self, action: "handleLongPress:")
let pinchGesture = UIPinchGestureRecognizer(target: self, action: "pinchRecognized:")
self.addGestureRecognizer(panGesture)
self.addGestureRecognizer(longPressGesture)
self.addGestureRecognizer(pinchGesture)
self.userInteractionEnabled = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func pinchRecognized(pinch: UIPinchGestureRecognizer) {
// change view scale based on pinch
self.transform = CGAffineTransformScale(self.transform, pinch.scale, pinch.scale)
pinch.scale = 1.0
}
func handlePanGesture(gesture: UIPanGestureRecognizer) {
// find translation in main view
let newTranslation = gesture.translationInView(self.superview)
// set current object to new position
self.center = CGPointMake(self.lastSavedLocation.x + newTranslation.x , self.lastSavedLocation.y + newTranslation.y)
}
// detect touch for the current view and change last save postion
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
// move touched view to front.
self.superview?.bringSubviewToFront(self)
self.layer.borderColor = UIColor.greenColor().CGColor
self.layer.borderWidth = 2
// save view location
self.lastSavedLocation = self.center
parent.imageSelected(self)
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.layer.borderWidth = 0
}
}
答
的声音,我想要的财产以后像则hitTest。
所以,我想你不会想和拖放工作。尽快触发一个marge(5-10或15dp/px)触发器,你锁定图像=>停止拖动并以编程方式定位视图...我没有测试这个,但是trhat是我的第一个方法。
虽然你不想与子视图但有子视图的边缘测试,我认为这将是可能的。
上面的链接看起来像一个平滑边缘剪裁。扭转逻辑,你应该能够剪辑到边界...
答
你可以尝试使用一种方法来检查UIImageView的边缘是否在超级视图的框架的一定距离内。
func checkEdge(view: UIImageView) {
let left = view.frame.minX
let right = view.frame.maxX
let bottom = view.frame.maxY
let top = view.frame.minY
if left <= 10 {
// Move view to left side
} else if right <= 10 {
// Move view to right side
} else if bottom <= 10 {
// Move view to bottom
} else if top <= 10 {
// Move view to top
} else {
// Do nothing
}
}
让我知道这是否工作和/或你在找什么!
你是否想在夹捏过程中捕捉对齐,或者只是在拖动过程中? –
另外,你如何控制图像视图的位置和大小?你正在设置其框架?你正在设置它的变换吗?你在更新它的限制吗? –
@robmayoff我更喜欢 – Lastmboy