精华内容
下载资源
问答
  • 2021-01-17 18:13:05

    展开全部

    UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本身62616964757a686964616fe4b893e5b19e31333363393061完全是由CoreAnimation来实现的(Mac下似乎不是这样)。它真正的绘图部分,是由一个叫CALayer(Core Animation Layer)的类来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性。

    2.UIView有个layer属性,可以返回它的主CALayer实例,UIView有一个layerClass方法,返回主layer所使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer来显示,例如通过

    1

    - (class) layerClass {

    2

    return ([CAEAGLLayer class]);

    3

    }

    使某个UIView的子类使用GL来进行绘制。

    3.UIView的CALayer类似UIView的子View树形结构,也可以向它的layer上添加子layer,来完成某些特殊的表示。例如下面的代码

    1

    grayCover = [[CALayer alloc] init];

    2

    grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];

    3

    [self.layer addSubLayer: grayCover];

    会在目标View上敷上一层黑色的透明薄膜。

    4.UIView的layer树形在系统内部,被系统维护着三份copy(这段理解有点吃不准)。

    第一份,逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。

    第二份,动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。

    第三份,显示树,这棵树的内容是当前正被显示在屏幕上的内容。

    这三棵树的逻辑结构都是一样的,区别只有各自的属性。

    5.动画的运作

    UIView的主layer以外(我觉得是这样),对它的subLayer,也就是子layer的属性进行更改,系统将自动进行动画生成,动画持续时间有个缺省时间,个人感觉大概是0.5秒。在动画时间里,系统自动判定哪些属性更改了,自动对更改的属性进行动画插值,生成中间帧然后连续显示产生动画效果。

    6.坐标系系统(对position和anchorPoint的关系还是犯晕)

    CALayer的坐标系系统和UIView有点不一样,它多了一个叫anchorPoint的属性,它使用CGPoint结构,但是值域是0~1,也就是按照比例来设置。这个点是各种图形变换的坐标原点,同时会更改layer的position的位置,它的缺省值是{0.5, 0.5},也就是在layer的中央。

    某layer.anchorPoint = CGPointMake(0.f, 0.f);

    如果这么设置,layer的左上角就会被挪到原来的中间的位置,

    加上这样一句就好了

    某layer.position = CGPointMake(0.f, 0.f);

    更多相关内容
  • 关于UIViewLayerIOS提供了三个方法:1、layoutSubviews在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空),iOS5.1之后(iOS6开始)的版本,此方法的缺省实现是使用你设置在此view上面的constraints...

    关于UIView的Layer,IOS提供了三个方法:

    1、layoutSubviews

    在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空),iOS5.1之后(iOS6开始)的版本,此方法的缺省实现是使用你设置在此view上面的constraints(Autolayout)去决定subviews的position和size。

    UIView的子类如果需要对其subviews进行更精确的布局,则可以重写此方法。只有在autoresizing和constraint-based

    behaviors of subviews不能提供我们想要的布局结果的时候,我们才应该重写此方法。可以在此方法中直接设置subviews的frame。

    我们不应该直接调用此方法,而应当用下面两个方法。

    2、setNeedsLayout

    此方法会将view当前的layout设置为无效的,并在下一个upadte cycle里去触发layout更新。

    3、layoutIfNeeded

    使用此方法强制立即进行layout,从当前view开始,此方法会遍历整个view层次(包括superviews)请求layout。因此,调用此方法会强制整个view层次布局。

    基于约束的AutoLayer的方法:

    1、setNeedsUpdateConstraints

    当一个自定义view的某个属性发生改变,并且可能影响到constraint时,需要调用此方法去标记constraints需要在未来的某个点更新,系统然后调用updateConstraints.

    2、needsUpdateConstraints

    constraint-based layout system使用此返回值去决定是否需要调用updateConstraints作为正常布局过程的一部分。

    3、updateConstraintsIfNeeded

    立即触发约束更新,自动更新布局。

    4、updateConstraints

    自定义view应该重写此方法在其中建立constraints. 注意:要在实现在最后调用[super

    updateConstraints]

    Auto Layout Process 自动布局过程

    与使用springs and struts(autoresizingMask)比较,Auto

    layout在view显示之前,多引入了两个步骤:updating constraints 和laying out

    views。每一个步骤都依赖于上一个。display依赖layout,而layout依赖updating

    constraints。 updating

    constraints->layout->display

    第一步:updating constraints,被称为测量阶段,其从下向上(from subview to super

    view),为下一步layout准备信息。可以通过调用方法setNeedUpdateConstraints去触发此步。constraints的改变也会自动的触发此步。但是,当你自定义view的时候,如果一些改变可能会影响到布局的时候,通常需要自己去通知Auto

    layout,updateConstraintsIfNeeded。

    自定义view的话,通常可以重写updateConstraints方法,在其中可以添加view需要的局部的contraints。

    第二步:layout,其从上向下(from super view to

    subview),此步主要应用上一步的信息去设置view的center和bounds。可以通过调用setNeedsLayout去触发此步骤,此方法不会立即应用layout。如果想要系统立即的更新layout,可以调用layoutIfNeeded。另外,自定义view可以重写方法layoutSubViews来在layout的工程中得到更多的定制化效果。

    第三步:display,此步时把view渲染到屏幕上,它与你是否使用Auto layout无关,其操作是从上向下(from super

    view to subview),通过调用setNeedsDisplay触发,

    因为每一步都依赖前一步,因此一个display可能会触发layout,当有任何layout没有被处理的时候,同理,layout可能会触发updating

    constraints,当constraint system更新改变的时候。

    需要注意的是,这三步不是单向的,constraint-based

    layout是一个迭代的过程,layout过程中,可能去改变constraints,有一次触发updating

    constraints,进行一轮layout过程。

    注意:如果你每一次调用自定义layoutSubviews都会导致另一个布局传递,那么你将会陷入一个无限循环中。

    如下图:

    a4c26d1e5885305701be709a3d33442f.png

    展开全文
  • iOS UIView控件

    2020-11-11 13:50:39
    UIView* redView1 = [[UIView alloc] initWithFrame:CGRectMake(40, 100, 100, 100)]; redView1.backgroundColor = [UIColor redColor]; [self.view addSubview:redView1]; UIView* blueView1 = [[UIView alloc] ...

    UIView表示屏幕上的一块矩形区域,几乎所有可视化控件都是UIView的子类。负责渲染区域的内容,并且响应该区域内发生的触摸事件。

    1. UIView的主要属性

    // frame的origin是相对于父视图的左上角原点(0,0)的位置
    @property(nonatomic) CGRect frame;
    // view的相对于自身的位置
    @property(nonatomic) CGRect bounds;
    // 整个视图的中心点
    @property(nonatomic) CGPoint center;
    
    // 是否隐藏,默认是NO
    @property(nonatomic,getter=isHidden) BOOL hidden;
    // 标记,为了跟别的View区分,默认为0
    @property(nonatomic) NSInteger tag;
    // 是否可以和用户进行交互,默认为YES
    @property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled;
    // 背景色
    @property(nullable, nonatomic,copy) UIColor *backgroundColor;
    // 子视图超出父视图范围是否裁剪子视图,默认是NO
    @property(nonatomic) BOOL clipsToBounds;
    // 当前视图的父视图
    @property(nullable, nonatomic,readonly) UIView *superview;
    

    framebounds的关系

    // redView1的frame=(40, 100, 100, 100) bounds=(0, 0, 100, 100)
    UIView *redView1 = [[UIView alloc] initWithFrame:CGRectMake(40, 100, 100, 100)];
    redView1.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView1];
    
    // blueView1的frame=(10, 10, 60, 60) bounds=(0, 0, 60, 60)
    UIView *blueView1 = [[UIView alloc] initWithFrame: CGRectMake(10, 10, 60, 60)];
    blueView1.backgroundColor = [UIColor blueColor];
    [redView1 addSubview:blueView1];
    
    UIView *redView2 = [[UIView alloc] initWithFrame:CGRectMake(200, 100, 100, 100)];
    redView2.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView2];
    
    // blueView2的原点设置为(-10, -10),可以超出父View显示    
    UIView *blueView2 = [[UIView alloc] initWithFrame:CGRectMake(-10, -10, 60, 60)];
    blueView2.backgroundColor = [UIColor blueColor];
    [redView2 addSubview:blueView2];
    
    // 设置父View的bounds原点,可以整体偏移子View坐标,负数向右下,正数向左上
    UIView *redView3 = [[UIView alloc] initWithFrame:CGRectMake(40, 250, 100, 100)];
    redView3.bounds = CGRectMake(-10, -10, 100, 100);
    redView3.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView3];
    
    UIView *blueView3 = [[UIView alloc] initWithFrame: CGRectMake(10, 10, 60, 60)];
    blueView3.backgroundColor = [UIColor blueColor];
    [redView3 addSubview:blueView3];
    
    UIView *redView4 = [[UIView alloc] initWithFrame:CGRectMake(200, 250, 100, 100)];
    redView4.bounds = CGRectMake(10, 10, 100, 100);
    redView4.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView4];
    
    UIView *blueView4 = [[UIView alloc] initWithFrame: CGRectMake(10, 10, 60, 60)];
    blueView4.backgroundColor = [UIColor blueColor];
    [redView4 addSubview:blueView4];
    

    显示如下
    在这里插入图片描述
    clipsToBounds设置为YES时,子视图被裁剪,显示如下
    在这里插入图片描述

    2. UIView的主要方法

    子视图操作

    // 添加子视图
    - (void)addSubview:(UIView *)view;
    // 从父视图中移除
    - (void)removeFromSuperview;
    
    // 将一个视图的层次设置成最上面
    - (void)bringSubviewToFront:(UIView *)view;
    // 将一个视图的层次设置成最下面
    - (void)sendSubviewToBack:(UIView *)view;
    
    // 插入指定视图的上面
    - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
    // 插入指定视图的下面
    - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;
    
    // 通过指定的标记值获取视图
    - (nullable __kindof UIView *)viewWithTag:(NSInteger)tag;
    

    视图绘制

    // 让整个视图重绘
    - (void)setNeedsDisplay;
    // 让视图指定的矩形区域重绘
    - (void)setNeedsDisplayInRect:(CGRect)rect;
    

    手势识别器

    // 添加手势识别器
    - (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer;
    // 删除手势识别器
    - (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer;
    

    示例代码

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] init];
        [gestureRecognizer addTarget:self action:@selector(singleTap:)];
        [redView addGestureRecognizer: gestureRecognizer];
    }
    
    - (void)singleTap:(UITapGestureRecognizer *)sender {
    }
    

    3. UIView和CALayer的关系

    UIViewCALayer是相互依赖的关系,UIView依赖与CALayer提供的内容,CALayer依赖UIView提供的容器来显示绘制的内容

    CALayer常用属性

    // 背景色
    @property(nullable) CGColorRef backgroundColor;
    // 边框颜色
    @property(nullable) CGColorRef borderColor;
    // 边框宽度
    @property CGFloat borderWidth;
    
    // 圆角
    @property CGFloat cornerRadius;
    // 图片背景
    @property(nullable, strong) id contents;
    // 超出主图层的部分把它给剪切掉
    @property BOOL masksToBounds;
    
    // 阴影颜色
    @property(nullable) CGColorRef shadowColor;
    // 阴影偏移度
    @property CGSize shadowOffset;
    // 阴影透明度
    @property float shadowOpacity;
    

    示例代码

    UIView *brownView1 = [[UIView alloc] initWithFrame:CGRectMake(40, 100, 100, 100)];
    // 设置背景色
    brownView1.layer.backgroundColor = [UIColor brownColor].CGColor;
    // 设置边框颜色
    brownView1.layer.borderColor = [UIColor redColor].CGColor;
    // 设置边框宽度
    brownView1.layer.borderWidth = 20;
    // 设置圆角
    brownView1.layer.cornerRadius = 5;
    [self.view addSubview:brownView1];
    
    UIView *brownView2 = [[UIView alloc] initWithFrame:CGRectMake(200, 100, 100, 100)];
    brownView2.layer.backgroundColor = [UIColor brownColor].CGColor;
    // 设置图片背景
    brownView2.layer.contents = (id)[UIImage imageNamed:@"icon_money"].CGImage;
    [self.view addSubview:brownView2];
    
    UIView *brownView3 = [[UIView alloc] initWithFrame:CGRectMake(40, 250, 100, 100)];
    brownView3.layer.backgroundColor = [UIColor brownColor].CGColor;
    brownView3.layer.contents = (id)[UIImage imageNamed:@"icon_money"].CGImage;
    brownView3.layer.cornerRadius = 50;
    // 设置超出主图层的部分把它给剪切掉
    brownView3.layer.masksToBounds = YES;
    [self.view addSubview:brownView3];
    
    UIView *brownView4 = [[UIView alloc] initWithFrame:CGRectMake(200, 250, 100, 100)];
    brownView4.layer.backgroundColor = [UIColor brownColor].CGColor;
    // 设置阴影颜色
    brownView4.layer.shadowColor = [UIColor blackColor].CGColor;
    // 设置阴影偏移度
    brownView4.layer.shadowOffset = CGSizeMake(10, 15);
    // 设置阴影透明度
    brownView4.layer.shadowOpacity = 0.6;
    
    [self.view addSubview:brownView4];
    

    显示如下
    在这里插入图片描述

    源码下载: https://github.com/nai-chen/IosBlog

    展开全文
  • ios uiview动画In this tutorial, we’ll be animating our UI Views in various ways in the iOS Application. 在本教程中,我们将在iOS应用程序中以各种方式对UI视图进行动画处理。 iOS UIView动画 (iOS UIView ...

    ios uiview动画

    In this tutorial, we’ll be animating our UI Views in various ways in the iOS Application.

    在本教程中,我们将在iOS应用程序中以各种方式对UI视图进行动画处理。

    iOS UIView动画 (iOS UIView Animations)

    Animations are a vital component in building beautiful UIs.

    动画是构建漂亮的UI的重要组成部分。

    Following are some of the basic properties of a view that can be animated:

    以下是可以设置动画的视图的一些基本属性:

    • center

      中央
    • alpha

      α
    • frame

    • bounds

      界线
    • transform

      转变
    • backgroundColor

      背景颜色
    • contentStretch

      contentStretch

    The syntaxes for UIView Animations are:

    UIView动画的语法为:

    UIView.animate(withDuration:, animations:)
    UIView.animate(withDuration:, delay:, animations:)
    UIView.animate(withDuration:, delay:, options:, animations:)
    UIView.animate(withDuration:, delay:, options:, animations:, completion:)
    UIView.animate(withDuration: 5.0, animations: {
                self.myView.alpha = 0
                print("animations")
            })

    With Delay:

    有延迟:

    UIView.animate(withDuration: 5.0, delay: 2.0, animations: {
                self.myView.alpha = 0
                print("animations")
            })

    Notice that there is a two second delay:

    请注意,有两秒钟的延迟:

    With Options

    有选项

    UIView.animate(withDuration: 5.0, delay: 2.0, options: [.autoreverse], animations: {
                self.myView.alpha = 0
                print("animations")
            })

    There are plenty of options available that we will see later in this tutorial. The above one auto-reverses the animation once before vanishing it off.

    有很多可用的选项,我们将在本教程的后面部分看到。 上面的动画会在动画消失之前自动反转一次。

    With completion
    A Completion handler closure gets called when the animation is completed.
    We can add a completion handler as shown below:

    随着完成
    动画完成后,将调用完成处理程序关闭。
    我们可以添加一个完成处理程序,如下所示:

    UIView.animate(withDuration: 5.0, animations: {
                self.myView.alpha = 0
                print("animations")
            },completion:
                {finished in
                    print("Is finished? \(finished)")
                    UIView.animate(withDuration: 1.0, animations:{
                    self.myView.alpha = 0.5
                    },completion: nil)
            })

    In this, we’ve chained another animation when the first is completed.

    ios basic animation with completion handler

    在此,当第一个动画完成时,我们链接了另一个动画。

    A completion is a trailing closure. We can enhance the readability of the code by calling the completion outside function as shown below:

    完成是尾随的结束。 我们可以通过调用complete外部函数来增强代码的可读性,如下所示:

    UIView.animate(withDuration: 5.0, animations: {
                self.myView.alpha = 0
                print("animations")
            }){finished in
                print("Is finished? \(finished)")
                UIView.animate(withDuration: 1.0, animations:{
                    self.myView.alpha = 0.5
                })
            }

    Note: finished is a boolean.

    注意:完成是布尔值。

    UIView.animateWithDuration(5.0, animations: {        
        println("animations")
    }, completion: { finished in          
        println("completion")
    })

    This is because no UIView was animated.

    这是因为没有UIView具有动画效果。

    You must call a view and animate it in the animation block.

    您必须调用视图并在动画块中为其设置动画。

    Let’s open up our Main.storyboard in our new XCode Project.
    Following is the UI we’ve created for the next three basic animations that we’ll perform:

    让我们在新的XCode项目中打开Main.storyboard。
    以下是我们为接下来将要执行的三个基本动画创建的UI:

    Create an IBAction in the ViewController.swift for each of the other Buttons similarly.

    类似地,在ViewController.swift中为其他每个Button创建一个IBAction。

    In order to set the Button text in two lines, set the line break to word wrap. To goto the next line press Option + Control + Enter while typing the title.
    为了将按钮文本设置为两行,请将换行符设置为自动换行。 要转到下一行,请在键入标题时按Option + Ctrl + Enter。

    动画色彩 (Animating Color)

    @IBAction func animateColor(_ sender: Any) {
    
        UIView.animate(withDuration: 1, animations: {
            self.myView.backgroundColor = UIColor.black
        }, completion: nil)
    
    }

    动画运动 (Animate Movement)

    Here we change the position of the view using the frame origin as the reference.
    A negative in x-direction means it goes to the left.
    A negative in the y-direction means it goes to the top.

    在这里,我们以帧原点为参考来更改视图的位置。
    x方向为负表示它向左移动。
    y方向上的负值表示它到达顶部。

    @IBAction func animateMovement(_ sender: Any) {
        UIView.animate(withDuration: 1, animations: {
            self.myView.frame.origin.x -= 40
        }, completion: nil)
        
    }

    动画大小 (Animate Size)

    Here we change the frame size width and height.

    在这里,我们更改框架大小的宽度和高度。

    @IBAction func animateSize(_ sender: Any) {
        UIView.animate(withDuration: 1, animations: {
            self.myView.frame.size.width += 40
            self.myView.frame.size.height += 10
        }){ finished in
            UIView.animate(withDuration: 1, animations: {
                self.myView.frame.size.width -= 40
                self.myView.frame.size.height -= 10
            })
        }
    }

    一起动画 (Animate Together)

    Here we’ll animate the size, color and position of the View together.

    在这里,我们将为“视图”的大小,颜色和位置设置动画。

    @IBAction func animateAllTogether(_ sender: Any) {
        
        if(animationRunning){
            self.myView.layer.removeAllAnimations()
            animationRunning = !animationRunning
        }
        else{
            animationRunning = !animationRunning
        UIView.animate(withDuration: 1, animations: {
            self.myView.backgroundColor = UIColor.green
            self.myView.frame.size.width += 50
            self.myView.frame.size.height += 20
            self.myView.center.x += 20
        }) { _ in
            UIView.animate(withDuration: 1, delay: 0.25, options: [.autoreverse, .repeat], animations: {
                self.myView.frame.origin.y -= 20
            })
        }
        }
    }

    animateRunning is a boolean variable that is used to toggle the UIView Animation.
    To stop the animation we do : self.myView.layer.removeAllAnimations().
    We’ve set the options to auto-reverse and repeat forever.

    animateRunning是一个布尔变量,用于切换UIView动画。
    要停止动画,我们要做: self.myView.layer.removeAllAnimations()
    我们将选项设置为自动反向并永久重复。

    The output of the above 4 basic animations is given below:

    ios ui view animation basic

    上面4个基本动画的输出如下:

    Next, we’ll look at Transform Animations and use the various options.

    接下来,我们将看一下“变换动画”并使用各种选项。

    变换动画 (Transform Animations)

    We can transform the scale, rotate the views to show animations.

    我们可以变换比例,旋转视图以显示动画。

    Following is the setup from the storyboard:

    以下是情节提要中的设置:

    In the above storyboard, we’ve linked all the 4 buttons to the same IBAction function. The same function would be triggered when any of these buttons is clicked. We can set a button tag to identify the buttons from each other.

    在上面的故事板上,我们已将所有4个按钮链接到相同的IBAction函数。 单击这些按钮中的任何一个将触发相同的功能。 我们可以设置一个按钮标签来相互识别按钮。

    There are 4 main types of animation curves:

    动画曲线有4种主要类型:

    • curveEaseIn

      curveEaseIn
    • curveEaseOut

      curveEaseOut
    • curveEaseInOut

      curveEaseInOut
    • curveLinear

      curveLinear

    Note: They are called curves since their animation graphs are curves!

    注意:因为它们的动画图是曲线,所以它们称为曲线!

    To Transform animations we do:

    要转换动画,我们要做:

    self.optionsView.transform = CGAffineTransform(scaleX: 0, y: 0)
                
                UIView.animate(withDuration: 1.0, delay: 0.0, options: [.curveEaseIn], animations: {
                    self.optionsView.transform  = .identity
                })

    CGAffineTransform sets the intial scale.
    self.optionsView.transform = .identity transforms the view to it’s original scale.

    CGAffineTransform设置初始比例。
    self.optionsView.transform = .identity将视图转换为其原始比例。

    We can set each of the options in their respective button tags as shown below:

    我们可以在各自的按钮标签中设置每个选项,如下所示:

    The output of the application in action for the above transform animation is given below:

    下面给出了上述变换动画的实际应用程序输出:

    Spring动画 (Spring Animations)

    Spring Animations behave like real-life springs. With their damping velocity and elasticity, they make a cool animation.

    弹簧动画的行为类似于现实中的弹簧。 凭借其衰减速度和弹性,他们制作了很酷的动画。

    Spring Animations can be set by adding the following syntax for the UIView Animations animate function.

    可以通过为UIView Animations animate功能添加以下语法来设置Spring Animations。

    UIView.animate(withDuration: 1, delay:, usingSpringWithDamping:, initialSpringVelocity:, options: [], animations: , completion:)

    usingSpringWithDamping requires a number between 0 and 1. It represents the damping ratio. The higher the number the springier the animation will be.
    Higher the intialSpringVelocity, higher the intial momentum.

    usingSpringWithDamping需要一个介于0和1之间的数字。它表示阻尼比。 数字越高 ,动画越弹性
    初始弹簧速度越高,初始动量越高。

    Again we’re creating a StackView with 4 Buttons for different use cases in our Main.storyboard:

    ios ui view animation spring setup

    再次,我们在Main.storyboard中为不同的用例创建一个带有4个按钮的StackView:

    The function springAnimationWithOptions is triggered everytime when any of the buttons is clicked:

    每次单击任何一个按钮时,都会触发springAnimationWithOptions函数:

    @IBAction func springAnimationWithOptions(_ sender: UIButton!) {
            
            if(sender.tag == 1)
            {
                self.optionsView.transform = CGAffineTransform(scaleX: 0, y: 0)
                UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
                    self.optionsView.transform = .identity
                }, completion: nil)
            }
            else if(sender.tag == 2)
            {
                self.optionsView.transform = CGAffineTransform(scaleX: 0, y: 0)
                UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
                    self.optionsView.transform = .identity
                }, completion: nil)
            }
            else if(sender.tag == 3)
            {
                self.optionsView.transform = CGAffineTransform(scaleX: 0, y: 0)
                UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0, options: .curveEaseInOut, animations: {
                    self.optionsView.transform = .identity
                }, completion: nil)
            }
            else if(sender.tag == 4)
            {
                self.optionsView.transform = CGAffineTransform(scaleX: 0, y: 0)
                UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.8, options: .curveEaseInOut, animations: {
                    self.optionsView.transform = .identity
                }, completion: nil)
            }
        }

    The output is:

    ios ui view animation spring output

    输出为:

    变换动画–平移,缩放,旋转 (Transform Animation – Translate, Scale, Rotate)

    We can scale translate and rotate in the following way:

    我们可以按以下方式缩放平移和旋转:

    let translate = CGAffineTransform(translationX: 120, y: 120)
    let rotate = CGAffineTransform(rotationAngle: 360)
    let scale = CGAffineTransform(scaleX: 2, y: 2)

    We can also chain together each of these by using the concatenating method:

    我们还可以通过使用串联方法将每个链接在一起:

    self.view.transform = translate.concatenating(rotate)

    Our Main.storyboard again hooks the 4 buttons for the use cases to a common IBAction button click function:

    我们的Main.storyboard再次将用例的4个按钮挂钩到一个通用的IBAction按钮单击功能:

    The code for the STRAnimationWithOptions function is given below:

    STRAnimationWithOptions函数的代码如下:

    @IBAction func STRAnimationWithOptions(_ sender: UIButton!) {
            
            if(sender.tag == 1)
            {
                let scale = CGAffineTransform(scaleX: 2, y: 2)
                self.optionsView.transform = scale
                UIView.animate(withDuration: 1, delay: 0, options: .curveEaseInOut, animations: {
                    self.optionsView.transform = .identity
                }, completion: nil)
            }
            else if(sender.tag == 2)
            {
                let translate = CGAffineTransform(translationX: -120, y: -120)
                self.optionsView.transform = translate
                UIView.animate(withDuration: 1, delay: 0, options: .curveEaseInOut, animations: {
                    self.optionsView.transform = .identity
                }, completion: nil)
            }
            else if(sender.tag == 3)
            {
                let rotate = CGAffineTransform(rotationAngle: 360)
                self.optionsView.transform = rotate
                UIView.animate(withDuration: 3, delay: 0, options: .curveEaseInOut, animations: {
                    self.optionsView.transform = .identity
                }, completion: nil)
            }
            else if(sender.tag == 4)
            {
                let rotate = CGAffineTransform(rotationAngle: 360)
                let translate = CGAffineTransform(translationX: -120, y: -120)
                let scale = CGAffineTransform(scaleX: 2, y: 2)
                self.optionsView.transform = rotate.concatenating(translate).concatenating(scale)
                UIView.animate(withDuration: 3, delay: 0,usingSpringWithDamping: 0.8,initialSpringVelocity: 0.5, options: [.autoreverse,.curveEaseInOut], animations: {
                    self.optionsView.transform = .identity
                }, completion: nil)
            }
        }

    In the last one, we’ve added spring animation as well. Check out the output of the Scale Rotate Translate Transform Animations.

    在上一个中,我们还添加了spring动画。 检出“缩放旋转平移变换动画”的输出。

    过渡选项 (Transition Options)

    Besides the curved animation option discussed above there are a few more.

    除了上面讨论的弯曲动画选项以外,还有其他一些选项。

    To create transition animations we do the following in Swift:

    要创建过渡动画,我们在Swift中执行以下操作:

    UIView .transition(with: self.myTextField, duration: 4, options: .transitionCrossDissolve,
                                   animations: {
                                    self.myTextField.textColor = UIColor.red
                })

    Let’s see some of the important transition options by example.

    让我们以示例的方式查看一些重要的过渡选项。

    First we need to set up the last part of our ViewController in the Main.storyboard:

    ios ui view animation transtition

    首先,我们需要在Main.storyboard中设置ViewController的最后一部分:

    We’ve created a UITextField and linked it to the ViewController.swift along with the three buttons.

    我们创建了一个UITextField并将其与三个按钮一起链接到ViewController.swift。

    The code for the transitionAnimationWithOptions function is given below:

    下面给出了transitionAnimationWithOptions函数的代码:

    @IBAction func transitionAnimationWithOptions(_ sender: UIButton!) {
            
            if(sender.tag == 1)
            {
                UIView .transition(with: self.myTextField, duration: 4, options: .transitionCrossDissolve,
                                   animations: {
                                    self.myTextField.textColor = UIColor.red
                }){finished in
                    self.myTextField.textColor = UIColor.white
                }
            }
            else if(sender.tag == 2)
            {
                UIView .transition(with: self.myTextField, duration: 4, options: .transitionFlipFromRight,
                                   animations: {
                                    self.myTextField.textColor = UIColor.red
                }){finished in
                    self.myTextField.textColor = UIColor.white
                }
            }
            else if(sender.tag == 3)
            {
                UIView .transition(with: self.myTextField, duration: 4, options: .transitionCurlUp,
                                   animations: {
                                    self.myTextField.textColor = UIColor.red
                })
            }
        }

    The output of the above application in action is given below:

    上面应用程序的输出如下:

    Wow, that’s the best for the last!

    哇,这是最后的最好!

    This brings an end to this tutorial. You can download the full XCode project with all the animations from the link below:

    本教程到此结束。 您可以从下面的链接下载完整的XCode项目以及所有动画:

    翻译自: https://www.journaldev.com/22104/ios-uiview-animations

    ios uiview动画

    展开全文
  • IOS UIView详解

    千次阅读 2018-12-27 08:49:58
    IOS UIView详解 1.官方类分析 UIView类头文件: #import <Foundation/Foundation.h> #import <QuartzCore/QuartzCore.h> #import &...
  • UIView的阴影设置主要通过UIViewlayer的相关属性来设置 阴影的颜色 imgView.layer.shadowColor = [UIColor blackColor].CGColor; 阴影的透明度 imgView.layer.shadowOpacity = 0.8f; 阴影的圆角 imgView....
  • iOS UIView生成清晰图片

    千次阅读 2019-08-23 11:46:25
    一般UIView转换成图片的方法 UIGraphicsBeginImageContext(rect.size); [view.paintView.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); ...
  • iOS UIView添加渐变色

    千次阅读 2019-05-06 09:35:42
    @interface UIView (TransitionColor) //添加渐变色 - (void)addDefaultTransitionColor; //- (void)addTransitionColor:(NSArray<UIColor *> *)colors; - (void)addTransitionCol...
  • UIView 部分圆角 我们可以使用view.layer.cornerRadius = 10来实现全部圆角,但是如何正确实现部分圆角了。 通过 maskLayer 方式 iOS 11之前通用处理方式 /// 部分圆角 /// - Parameters: /// - corners: `...
  • ios UIView 常用设置

    2018-12-27 11:25:58
    文章目录IOS UIView常用设置UIView设置背景图片的方式 IOS UIView常用设置 UIView设置背景图片的方式 一 . 设置UIView的背景图片 1.将图片作为UIView的背景色,该方法过于占内存,不建议使用。 //1.imageNamed...
  • ios UIView的mask属性,view和layer的关系

    千次阅读 2019-08-20 16:07:47
    view和layer的关系 :https://www.jianshu.com/p/9c7a23ea705b 什么是mask: CALayer有一个属性叫做mask,通常被称为蒙版图层,mask类似于子视图,但却不是一个普通的子视图,它本身也是CALayer类型,具有和其他图层...
  • iOS UIView的绘制原理

    2020-08-05 16:37:19
    当我们调用UIView的setNeedDisplay方法之后,系统会调用view对应layer的setNeedsDisplay方法,相当于在当前layer上打了一个标记; 在当前runloop即将结束的时候调用CALayer的display方法,然后进入我们视图的真正...
  • iOS - 指定UIView的某几个角为圆角

    千次阅读 2020-12-29 03:10:20
    如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架)。而若要指定某几个角(小于4)为圆角而别的不变时,这种方法就不好用了。对于这种情况,...
  • 但是,大家会发现iOS的View提供了一个 removeFromSuperview 的方法 可以将View从父级View上删除 但是,如何删除View的所有子View 好像没有一个更好的办法。 有一个方法是:通过view.subviews 取到所有子View的数组...
  • extension UIView{ /* width:虚线的宽度 length:虚线的长度 space:虚线间的间距 cornerRadius:view圆角 color:虚线的颜色 */ func swiftDrawBoardDottedLine(width:CGFloat, length:CGFloat,space:...
  • //翻页效果动画 左边 [UIView beginAnimations:@"animation" context:nil]; [UIView setAnimationDuration:1.0f]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.naviga
  • ios - 在UIView外部添加边框(而不是在内部)如果使用视图中的代码添加视图的边框self.layer.borderColor = [UIColor yellowColor].CGColor;self.layer.borderWidth = 2.0f;边框添加到视图内部,如下所示:右视图是...
  • iOS UIView设置渐变背景色

    千次阅读 2018-11-27 20:04:02
    CAGradientLayer *gradientLayer = [[CAGradientLayer alloc] init]; gradientLayer.frame = CGRectMake(0, 0, imageView.frame.size.width, mainFrame.size... [backView.layer addSublayer:gradientLayer];  
  • iOS UIView设置背景图片4种方式

    千次阅读 2017-12-11 19:41:05
    设置UIView的背景图片 1.将图片作为UIView的背景色,该方法过于占内存,不建议使用。  //1.imageNamed方式  self.view.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"image....
  • iOSUIView layer的对应关系

    千次阅读 2015-05-30 14:27:57
    UIView* backgroundView = [[UIView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]];  UIView* roleView= [[UIView alloc]initWithFrame:CGRectMake(0.0, 0.0, 100.0, 200.0)];  ...
  • ///把UIView转换成UIImage + (UIImage *)imageFromView:(UIView*)view {  CGSize size = view.bounds.size;  // 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要...
  • //if you need mask layer property UIView *copiedViewWithDrawRect = (UIView *)[originalView pm_copyWithNeedsDrawRect:YES]; //copy using the snapshot api. iOS 7 only UIView *copiedViewFromSnapshot = ...
  • 5 animate.repeatCount = 1 animate.isRemovedOnCompletion = true // zPosition 默认都为 0 self.topView.layer.zPosition = 500 self.flipView.layer.zPosition = 100 self.zuheImageView.layer.add(animate, for...
  • 1. CALayer和UIView之间的关系:  在iOS系统中,你能看得见摸得着的东西基本上都是UIView... 在创建UIView对象时,UIView内部会自动创建一个层(即CALayer对象),通过UIViewlayer属性可以访问这个层。当UIView
  • ios动画原理 modelLayer和presentationLayer以及点击交互 我们知道,iOS的动画,和其对应的layer...由结果可知,在UIView动画的回调中添加打印,只会打印一次,且打印的是最终的view和Layer 的位置,这显然不是想要的结
  • UIView指定设置圆角及Layer的mask的简单理解 在App开发中,为了美观,我们常常会设置图片圆角,常规情况下都是设置四个角圆角,这种场景也是非常常见的,我们今天要考虑的场景是部分圆角的场景。比如设置左上、右上...
  • UIView加边框及边框颜色 引用库: 代码如下: #import 使用: 代码如下: //添加边框和提示  CGRect frameRect = CGRectMake(20, 90, self.window.frame.size.width-40, self.window.... frameView.layer.border
  • 在开发中我们经常会遇到对一个UIView 设置四个圆角的情况,这种情况是很好处理的。但是如果遇到只设置其中的某几个圆角的情况怎么办呢?有一种方法是通过UIBezierPath的方法来做,代码如下: /** * 设置uiview 的...
  • UIViewiOS 系统中界面元素的基础,所有的界面元素都继承自它; 它本身完全是由 CoreAnimation 来实现的; 它真正的绘图部分,是由一个叫 CALayer(CoreAnimation Layer)的类来管理; UIView 本身更像是一...
  • - (UIImage *)captureScreenForView:(UIView *)currentView { // 开启一个绘图的上下文 UIGraphicsBeginImageContextWithOptions(CGSizeMake(currentView.size.width, currentView.size.height), NO, 0.0); // ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,675
精华内容 8,270
关键字:

ios uiview 获取指定layer

友情链接: Spastem.rar