gpt4 book ai didi

ios - UIView 拆分过渡

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:06:34 26 4
gpt4 key购买 nike

我很可能只是使用了错误的术语,但我一直在寻找是否有一个 iOS UIView 转换拆分一个 View (蓝色)和任何 subview 控件以显示另一个 View (红色) ) 及其控件。我发现有几篇文章提到了 2011 年的类似内容,但最近没有提及,所以想知道现在我们已经升级到 iOS 8 是否添加了任何新内容。任何指点将不胜感激。

enter image description here

最佳答案

如果您尝试进行这样的分割过渡,我已经为 View Controller 过渡创建了一个动画 Controller 。如果你看代码,你会发现可以有两种不同的方式进行中转,从中间打开from view或者toview出现并折叠在from view的顶部。

这是下面代码如何工作的小 gif;

enter image description here

class AnimationController: NSObject, UIViewControllerAnimatedTransitioning {

let presenting: Bool

init(presenting: Bool) {
self.presenting = presenting
}

func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
return 1.0
}

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
animateOutImagesWithContext(transitionContext)
//animateInImagesWithContext(transitionContext)
}

func snapshotView(view: UIView!) -> UIImage {
UIGraphicsBeginImageContext(view.bounds.size)
view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return snapshotImage
}

func animateOutImagesWithContext(transitionContext:UIViewControllerContextTransitioning) {

let containerView = transitionContext.containerView()

let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)

let fromView = fromViewController!.view
let toView = toViewController!.view

containerView.addSubview(toView)

let snapshotImage = snapshotView(fromView)

fromView.removeFromSuperview()

let imageViews = animatingOutImageViews(snapshotImage)

containerView.addSubview(imageViews.firstImageView)
containerView.addSubview(imageViews.secondImageView)

UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
let firstImageView = imageViews.firstImageView
let secondImageView = imageViews.secondImageView

if self.presenting {

firstImageView.frame = CGRectOffset(firstImageView.frame, -CGRectGetWidth(firstImageView.frame), 0)
secondImageView.frame = CGRectOffset(secondImageView.frame, CGRectGetWidth(secondImageView.frame), 0)
} else {
firstImageView.frame = CGRectOffset(firstImageView.frame, 0, -CGRectGetHeight(firstImageView.frame))
secondImageView.frame = CGRectOffset(secondImageView.frame, 0, CGRectGetHeight(secondImageView.frame))

}
}) { (completed: Bool) -> Void in
imageViews.firstImageView.removeFromSuperview()
imageViews.secondImageView.removeFromSuperview()
transitionContext.completeTransition(true)
}

}

func animateInImagesWithContext(transitionContext:UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView()

let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)

let fromView = fromViewController!.view
let toView = toViewController!.view

containerView.insertSubview(toView, belowSubview: fromView)

let snapshotImage = snapshotView(toView)

let imageViews = animatingInImageViews(snapshotImage)

containerView.addSubview(imageViews.firstImageView)
containerView.addSubview(imageViews.secondImageView)

UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
let firstImageView = imageViews.firstImageView
let secondImageView = imageViews.secondImageView

if self.presenting {

firstImageView.frame = CGRectOffset(firstImageView.frame, 0, CGRectGetHeight(firstImageView.frame))
secondImageView.frame = CGRectOffset(secondImageView.frame, 0, -CGRectGetHeight(secondImageView.frame))

} else {
firstImageView.frame = CGRectOffset(firstImageView.frame, CGRectGetWidth(firstImageView.frame), 0)
secondImageView.frame = CGRectOffset(secondImageView.frame, -CGRectGetWidth(secondImageView.frame),0)

}
}) { (completed: Bool) -> Void in
fromView.removeFromSuperview()
imageViews.firstImageView.removeFromSuperview()
imageViews.secondImageView.removeFromSuperview()
transitionContext.completeTransition(true)
}
}

func animatingOutImageViews(snapshotImage: UIImage) -> (firstImageView: UIImageView!, secondImageView: UIImageView!)
{
let imageSize = snapshotImage.size

var firstPartFrame: CGRect
var secondPartFrame: CGRect

if presenting {
firstPartFrame = CGRectMake(0, 0, imageSize.width * 0.5, imageSize.height)
secondPartFrame = CGRectOffset(firstPartFrame, CGRectGetWidth(firstPartFrame), 0)
} else {
firstPartFrame = CGRectMake(0, 0, imageSize.width, imageSize.height * 0.5)
secondPartFrame = CGRectOffset(firstPartFrame, 0, CGRectGetHeight(firstPartFrame))
}

let firstImage = getImage(snapshotImage, insideRect: firstPartFrame)
let secondImage = getImage(snapshotImage, insideRect: secondPartFrame)

let firstImageView = UIImageView(frame: firstPartFrame)
firstImageView.image = firstImage
let secondImageView = UIImageView(frame: secondPartFrame)
secondImageView.image = secondImage

return (firstImageView, secondImageView)
}

func animatingInImageViews(snapshotImage: UIImage) -> (firstImageView: UIImageView!, secondImageView: UIImageView!)
{
let imageSize = snapshotImage.size

var firstPartFrame: CGRect
var secondPartFrame: CGRect

if presenting {
firstPartFrame = CGRectMake(0, 0, imageSize.width, imageSize.height * 0.5)
secondPartFrame = CGRectOffset(firstPartFrame, 0, CGRectGetHeight(firstPartFrame))
} else {
firstPartFrame = CGRectMake(0, 0, imageSize.width * 0.5, imageSize.height)
secondPartFrame = CGRectOffset(firstPartFrame, CGRectGetWidth(firstPartFrame), 0)
}

let firstImage = getImage(snapshotImage, insideRect: firstPartFrame)
let secondImage = getImage(snapshotImage, insideRect: secondPartFrame)

let firstImageView = UIImageView(image: firstImage)
let secondImageView = UIImageView(image: secondImage)

if presenting {
firstImageView.frame = CGRectOffset(firstPartFrame, 0, -CGRectGetHeight(firstPartFrame))
secondImageView.frame = CGRectOffset(secondPartFrame, 0, CGRectGetHeight(secondPartFrame))
} else {
firstImageView.frame = CGRectOffset(firstPartFrame, -CGRectGetWidth(firstPartFrame), 0)
secondImageView.frame = CGRectOffset(secondPartFrame, CGRectGetWidth(secondPartFrame), 0)
}

return (firstImageView, secondImageView)
}

func getImage(image: UIImage, insideRect rect:CGRect) -> UIImage {
let image = CGImageCreateWithImageInRect(image.CGImage, rect)!
return UIImage(CGImage: image)!
}
}

class SecondViewController: UIViewController, UIViewControllerTransitioningDelegate {

required init(coder aDecoder: NSCoder) {

fatalError("init(coder:) has not been implemented")
}

init() {
super.init(nibName: nil, bundle: nil)
self.transitioningDelegate = self
}

override func viewDidLoad() {
super.viewDidLoad()
let view1 = UIView(frame: CGRectZero)
view1.backgroundColor = UIColor.purpleColor()
view1.setTranslatesAutoresizingMaskIntoConstraints(false)

let view2 = UIView(frame: CGRectZero)
view2.backgroundColor = UIColor.cyanColor()
view2.setTranslatesAutoresizingMaskIntoConstraints(false)

view.addSubview(view1)
view.addSubview(view2)

let views = [
"view1": view1,
"view2": view2
]

let vFormat = "V:|[view1][view2(==view1)]|"
let hFormat = "H:|[view1]|"

let hConstraints = NSLayoutConstraint.constraintsWithVisualFormat(hFormat,
options: .allZeros,
metrics: nil,
views: views)
let vConstraints = NSLayoutConstraint.constraintsWithVisualFormat(vFormat,
options: .AlignAllLeft | .AlignAllRight,
metrics: nil,
views: views)

view.addConstraints(hConstraints)
view.addConstraints(vConstraints)

let tapGestureRecognizer = UITapGestureRecognizer(target: self,
action: "tapped")
view.addGestureRecognizer(tapGestureRecognizer)
}

func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return AnimationController(presenting: true)
}

func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return AnimationController(presenting: false)
}

func tapped() {
let nextViewController = NextViewController()
dismissViewControllerAnimated(true, completion: nil)
}
}


class FirstViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()
let view1 = UIView(frame: CGRectZero)
view1.backgroundColor = UIColor.redColor()
view1.setTranslatesAutoresizingMaskIntoConstraints(false)

let view2 = UIView(frame: CGRectZero)
view2.backgroundColor = UIColor.greenColor()
view2.setTranslatesAutoresizingMaskIntoConstraints(false)

view.addSubview(view1)
view.addSubview(view2)

let views = [
"view1": view1,
"view2": view2
]

let hFormat = "H:|[view1][view2(==view1)]|"
let vFormat = "V:|[view1]|"

let hConstraints = NSLayoutConstraint.constraintsWithVisualFormat(hFormat,
options: .AlignAllTop | .AlignAllBottom,
metrics: nil,
views: views)
let vConstraints = NSLayoutConstraint.constraintsWithVisualFormat(vFormat,
options: .allZeros,
metrics: nil,
views: views)

view.addConstraints(hConstraints)
view.addConstraints(vConstraints)

let tapGestureRecognizer = UITapGestureRecognizer(target: self,
action: "tapped")
view.addGestureRecognizer(tapGestureRecognizer)

}

func tapped() {
let secondViewController = SecondViewController()
presentViewController(secondViewController, animated: true, completion: nil)
}
}

代码可能会稍长一些,但必须易于理解。如果需要,请稍微调整一下。

关于ios - UIView 拆分过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30462159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com