天道酬勤,学无止境

如何为 CALayer 的高度设置动画,原点来自底部而不是顶部?(How can I animate the height of a CALayer with the origin coming from the bottom instead of the top?)

问题

我想为一个简单的 CALayer 设置动画以响应传入数据(图形均衡器上的条)上下移动

CALayer 应该沿着底部保持固定,并随着高度的动画上下移动。

任何人都可以就实现这一目标的最佳方法提出建议,而无需为原点 y 坐标和高度设置动画?

回答1

如果您希望图层始终从底部增长和收缩,那么您应该在底部的图层上设置自己的anchorPoint 。 锚点在图层单位坐标空间中指定,因此无论大小如何,X 和 Y 都在边界内从 0 到 1 的范围内。

yourLayer.anchorPoint = CGPointMake(0.5, 1.0);

然后对于动画,您只需为边界设置动画(或者甚至更好,您可以为"bounds.size.height"设置动画,因为只有高度在变化):

// set the new bounds of yourLayer here...

CABasicAnimation *grow = [CABasicAnimation animationWithKeyPath:@"bounds.size.height"];
grow.fromValue = @0;   // from no height
grow.toValue   = @200; // to a height of 200
grow.duration  = 0.5;
// add any additional animation configuration here...
[yourLayer addAnimation:grow forKey:@"grow the height of the layer"];

  • 你可以在我几年前写的这篇文章中阅读更多关于锚点的信息。
  • 您可以在文档中阅读有关 Core Animation 的键值编码扩展的更多信息。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • iOS:如何为新的自动布局约束(高度)设置动画(iOS: How does one animate to new autolayout constraint (height))
    问题 我以前从未使用过自动布局约束。 我正在使用一个小型新应用程序,并且注意到NIB的视图默认为自动布局。 因此,我认为我将借此机会与之合作,并尝试弄清苹果公司将如何发展。 第一个挑战: 我需要调整MKMapView的大小,然后将其设置为新位置。 如果我以惯常的方式这样做: [UIView animateWithDuration:1.2f animations:^{ CGRect theFrame = worldView.frame; CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170); worldView.frame = newFrame; }]; ...然后,每当更新同级视图时,MKMapView就会“捕捉”回到其原始高度(在我的情况下,UISegmentedControl的标题正在更新[myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0] )。 所以,我想,我想要做的是从等于父视图的HIGHT改变的MKMapView的约束是相对UISegmentedControl的顶部,它是涵盖: V:[MKMapView]-(16)-
  • 如何为UITableView中的节标题的高度变化设置动画?(How to animate the height change of an section header in UITableView?)
    问题 我已经实现了此方法以返回节标题高度。 但是,当该部分的高度改变时,它会立即发生而没有动画。 有动画吗? - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if (flatHeader) { return 50.0f; } else { return 100.0f; } } 回答1 我不是100%确信这适用于表标题,但适用于表行,因此值得一试。 我有一个实例变量headerHeight最初设置为44.0,我将其更改为: - (void)changeHeight { [self.tableView beginUpdates]; headerHeight = 88.0; [self.tableView endUpdates]; } 在我的代码中,我在heightForRowAtIndexPath返回headerHeight ,但是您可以在heightForHeaderInSection尝试它: - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return headerHeight; } 回答2 这有效:
  • Objective-C 中的“推送”动画(“Push” animation in Objective-C)
    问题 我有两个视图:A 和 B。A 位于屏幕顶部,B 位于屏幕底部。 当用户按下按钮时,视图 B 会以 EaseInEaseOut 贝塞尔曲线向上动画,直到它到达 y = 0。当 B 在前往目的地的途中,它应该在击中 A 时向上推 A。换句话说,当 B 有在从底部到顶部的过渡过程中通过了某个 y 坐标(A 的 y 原点 + 高度),A 应该粘在 B 上,所以看起来 B 向上推动了 A。 到目前为止我尝试过的: 在用户按下按钮后立即将目标 + 选择器注册到 CADisplayLink。 在这个选择器中,通过访问它的presentationLayer 请求视图B 的y 坐标并相应地调整A 的y 坐标。 但是,这种方法不够准确:presentationLayer 的帧落后于 B 在屏幕上的当前位置(这可能是因为 -presentationLayer 重新计算了当前时间的动画视图的位置,需要的时间超过 1 帧) . 当我增加 B 的动画持续时间时,这种方法工作正常。 在用户按下按钮后立即将目标 + 选择器注册到 CADisplayLink。 在此选择器中,通过求解 x = 已用时间/动画持续时间(应返回行进距离/总距离的商)的贝塞尔方程来计算 B 的当前 y 坐标。 我为此使用了 Apple 的开源 UnitBezier.h (http://opensource.apple.com
  • 何时调用layoutSubviews?(When is layoutSubviews called?)
    问题 我有一个自定义视图,在动画过程中没有收到layoutSubview消息。 我有一个充满整个屏幕的视图。 它在屏幕底部有一个自定义子视图,如果我更改导航栏的高度,该子视图将在Interface Builder中正确调整大小。 创建视图时将调用layoutSubviews ,但不会再次调用。 我的子视图已正确布置。 如果我将通话中的状态栏关闭,则即使主视图会为其调整大小设置动画,也根本不会调用该子视图的layoutSubviews 。 在什么情况下实际上会调用layoutSubviews ? 我的自定义视图的autoresizesSubviews设置为NO 。 在Interface Builder中,我具有顶部和底部的支撑杆以及垂直箭头设置。 难题的另一部分是必须将窗口设置为关键: [window makeKeyAndVisible]; 其他子视图不会自动调整大小。 回答1 我有一个类似的问题,但对答案(或任何我可以在网上找到的答案)不满意,因此我在实践中尝试了一下,这就是我得到的: init不会导致layoutSubviews被调用(duh) addSubview:导致在要添加的视图,要添加到该视图的视图(目标视图)以及目标的所有子视图上调用layoutSubviews view setFrame仅在框架的大小参数不同时
  • 如何在UIView的顶部添加边框(How to add a border just on the top side of a UIView)
    问题 我的问题是标题。 我不知道如何在特定的侧面,顶部或底部,任何侧面添加边框... layer.border绘制整个视图的边框... 回答1 我考虑在此UIView子类并重写drawRect 。 为什么不在UIView上添加扩展并添加边框子视图? @discardableResult func addBorders(edges: UIRectEdge, color: UIColor, inset: CGFloat = 0.0, thickness: CGFloat = 1.0) -> [UIView] { var borders = [UIView]() @discardableResult func addBorder(formats: String...) -> UIView { let border = UIView(frame: .zero) border.backgroundColor = color border.translatesAutoresizingMaskIntoConstraints = false addSubview(border) addConstraints(formats.flatMap { NSLayoutConstraint.constraints(withVisualFormat: $0, options: [], metrics: [
  • 最新整理:iOS面试题-常问UI问题(四)
    前言:最近把 iOS 面试中可能会遇到的问题整理了一番, 题目大部分是网上收录的, 方便自己巩固复习, 也分享给大家; 希望对大家有所帮助!对于答案,不一定都合适,欢迎大家积极讨论;整理不易,如果您觉得还不错,麻烦在文末 “点个赞” ,或者留下您的评论“Mark” 一下,谢谢您的支持iOS面试题-常问UI问题(四)1.ViewController 生命周期单个viewController的生命周期- initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib) - loadView:加载view - viewDidLoad:view加载完毕 - viewWillAppear:控制器的view将要显示 - viewWillLayoutSubviews:控制器的view将要布局子控件 - viewDidLayoutSubviews:控制器的view布局子控件完成 - viewDidAppear:控制器的view完全显示 - viewWillDisappear:控制器的view即将消失的时候 - viewDidDisappear:控制器的view完全消失的时候 - dealloc 控制器销毁两个控制器AB进行跳转调用顺序:A控制器先展示调用 - [ViewControllerA loadView] - [ViewControllerA
  • 自动布局UIScrollView以及具有动态高度的子视图(Auto layout UIScrollView with subviews with dynamic heights)
    问题 我在使用自动布局约束的UIScrollView时遇到了麻烦。 我具有以下视图层次结构,并通过IB设置了约束: - ScrollView (leading, trailing, bottom and top spaces to superview) -- ContainerView (leading, trailing, bottom and top spaces to superview) --- ViewA (full width, top of superview) --- ViewB (full width, below ViewA) --- Button (full width, below ViewB) ViewA和ViewB的初始高度为200点,但是可以通过单击将其垂直扩展到400点的高度。 通过更新其高度限制(从200到400)来扩展ViewA和ViewB。 这是相应的代码段: if(self.contentVisible) { heightConstraint.constant -= ContentHeight; // + additional View's internal constraints update to hide additional content self.contentVisible = NO; } else {
  • 如何在UITableViewCell之间添加间距(How to add spacing between UITableViewCell)
    问题 有什么办法可以增加UITableViewCell之间的间隔吗? 我创建了一个表格,每个单元格只包含一个图像。 图像被分配给像这样的单元格: cell.imageView.image = [myImages objectAtIndex:indexPath.row]; 但这会使图像放大并适合整个单元格,并且图像之间没有间距。 或以这种方式说,图像的高度例如为50,我想在图像之间添加20个间距。 有什么办法可以做到这一点? 回答1 我使用Swift的简单解决方案: // Inside UITableViewCell subclass override func layoutSubviews() { super.layoutSubviews() contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)) } 结果 回答2 迅捷版 已为Swift 3更新 为了将来的观众,这个答案比原始问题更笼统。 它是Swift的基本UITableView示例的补充示例。 概述 基本思想是为每个数组项创建一个新节(而不是新行)。 然后可以使用节标题高度来分隔节。 怎么做 如Swift的UITableView示例中所述设置项目。 (也就是说
  • 如何在iPhone中自定义tableView分隔符(How to customize tableView separator in iPhone)
    问题 默认情况下,在uitableview中只有一个行分隔符。 但是我想将定制行作为分隔符。 可能吗? 如何? 回答1 如果您要做的不仅仅是使用UITableView的spacerColor属性更改分隔符的颜色,则可以将spacerStyle属性设置为UITableViewCellSeparatorStyleNone,然后执行以下任一操作: 创建自定义UITableViewCells,其中包含自定义分隔符创建包含自定义分隔符的备用[UITableViewCell] [6] 例如,如果您的表当前显示5行,则可以对其进行更新以显示9行,而索引1、3、5、7的行将是分隔单元格。 回答2 更好的解决方案是使用单元的当前宽度和高度。 像这样的东西: UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width, 1)]; lineView.backgroundColor = [UIColor darkGrayColor]; [cell.contentView addSubview:lineView]; 回答3 如果您需要为不同的行使用不同的分隔符颜色
  • 如何为表格行的动画设置动画?(How to animate toggling of table rows?)
    问题 我想为表格行的外观和消失设置动画。 首先,我尝试使用CSS过渡,但是由于display属性的更改,它没有执行任何操作。 因此,我使用了动画,该动画可以按预期工作。 问题是,动画开始时将保留行的整个高度。 有关问题的说明,请参见下面的代码段:在动画开始之前,将第3行直接向下推。 如何逐步设置行的高度动画,使其仅占用所需的空间? 作为奖励: 行的高度不需要固定它应该显示为翻译而不是缩放; 它应该看起来像是从上方行的底部滑动它应该是双向的(当我隐藏它时,做相反的事情) $('button').on('click', function() { $('tr:nth-child(2)').toggleClass('active'); }); @keyframes anim { 0% { transform: scaleY(0); } 100% { transform: scaleY(1); } } tr { background: #eee; border-bottom: 1px solid #ddd; display: none; transform-origin: top; } tr.active { display: table-row; animation: anim 0.5s ease; } td { padding: 10px; } <script src="https:/
  • 使用AutoLayout调整圆形(圆形)UIView的大小...在调整大小的动画期间如何为cornerRadius设置动画?(Circular (round) UIView resizing with AutoLayout… how to animate cornerRadius during the resize animation?)
    问题 我有一个子类的UIView,我们可以称之为CircleView 。 CircleView会自动将拐角半径设置为其宽度的一半,以使其成为圆形。 问题是,当“ CircleView”被自动布局约束调整大小时(例如在设备旋转时) ,它会严重扭曲,直到调整大小为止,因为“ cornerRadius”属性必须跟上,并且操作系统仅发送对视图框架的单个“边界”更改。 我想知道是否有人有一个很好的,清晰的策略来实现“ CircleView”,这种方式在这种情况下不会变形,但仍会将其内容掩盖为圆形,并允许在所述UIView周围存在边框。 回答1 更新:如果您的部署目标是iOS 11或更高版本: 从iOS 11开始,如果在动画块中更新UIKit,则UIKit将为cornerRadius设置动画。 只需在UIView动画块中设置视图的layer.cornerRadius ,或(以处理界面方向更改),将其设置在layoutSubviews或viewDidLayoutSubviews 。 原文:如果您的部署目标早于iOS 11: 所以你想要这个: (我启用了“调试”>“慢动画”以使平滑度更容易看到。) 顺带一提,请随时跳过此段:事实证明,这比应该做的要难得多,因为iOS SDK并未以方便的方式提供自动旋转动画的参数(持续时间,时序曲线)。 你可以(我认为)让他们通过覆盖
  • iOS 7.1 滑动解锁文字动画(iOS 7.1 Slide To Unlock Text Animation)
    问题 我不确定以前是否有人问过这个问题,但我很难找到它。 也许我没有使用正确的搜索词,所以如果答案已经存在,如果有人能指出我正确的方向,我将不胜感激! 我刚刚注意到锁屏“滑动解锁”文本上的微光动画随着 iOS 7.1 更新而改变。 聚光灯现在有一个卵形/菱形形状,它在字母上层叠,而不会出现在它后面的视图中。 过去,我通过依次更改单个字母的颜色来复制这种类型的功能,但为此,动画会穿过字母的中间。 不影响背景。 我怎样才能复制这个? 回答1 您可以为标签文本设置动画并为其使用自定义滑块,希望对您有所帮助: CALayer *maskLayer = [CALayer layer]; // Mask image ends with 0.15 opacity on both sides. Set the background color of the layer // to the same value so the layer can extend the mask image. maskLayer.backgroundColor = [[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.15f] CGColor]; maskLayer.contents = (id)[[UIImage imageNamed:@"Mask.png"
  • 如何为iPhone 5屏幕分辨率开发或迁移应用程序?(How to develop or migrate apps for iPhone 5 screen resolution?)
    问题 新的iPhone 5显示屏具有新的长宽比和新的分辨率(640 x 1136像素)。 开发新的应用程序或将现有的应用程序过渡到新的屏幕尺寸需要什么? 对于旧的显示器和新的宽屏高宽比,我们应该记住什么使应用程序“通用”? 回答1 下载并安装最新版本的Xcode。 为您的应用设置启动屏幕文件(在目标设置的常规标签中)。 这样便可以使用任何屏幕的完整尺寸,包括iOS 9中的iPad分割视图尺寸。 测试您的应用程序,并希望不执行其他任何操作,因为如果您正确设置了自动调整蒙版的大小或使用了“自动布局”,那么一切都将神奇地工作。 如果没有,请调整视图布局,最好使用“自动布局”。 如果您需要为较大的屏幕做一些特定的事情,那么您似乎必须检查[[UIScreen mainScreen] bounds]高度,因为似乎没有针对此的特定API。 从iOS 8开始,还有一些大小类可将屏幕大小抽象为垂直或水平方向上的紧凑或紧凑,并且是适应UI的推荐方式。 回答2 如果您有为iPhone 4S或更早版本构建的应用程序,则它将在信箱中运行iPhone 5。 为了使您的应用适应更高的新屏幕,您要做的第一件事是将启动图像更改为:Default-568h@2x.png。 它的大小应为1136x640(HxW)。 是的,在新的屏幕尺寸中具有默认图像是使您的应用占据新iPhone 5整个屏幕的关键。 (请注意
  • 如何为大型阵列加速ngFor?(How can I speed up ngFor for a large array?)
    问题 我正在Pokedex网站上工作,由于现在有了721 Pokemon,因此ngFor会花很长时间才能第一次显示所有条目。 加载完所有数据后,将它们实际放入DOM似乎要花费大约2400毫秒。 这是有问题的ngFor: <entry *ngFor="let p of (pokedex | filter:search:SelectedVer), let i = index, let last = last" [id]="'pokemon-entry-' + p.id" [pokemon]="p" [language]="SelectedLang" (click)="SelectPokemon(p)"></entry> 我在Chrome的开发工具中运行了时间表,并得到了如下所示的内容: 我对时间轴没有太多经验,但是在我看来,中间的块太大了(顶部标记为XHR Load (/csv/pokemon_game_indices.csv) )。 根据时间轴,ajax调用本身需要0.02毫秒。 我假设使这个很大的块的原因是在ajax请求完成之后进行的更改检测。 那就是当我拿起我一直在构建的模型并将它们放到ngFor上面使用的pokedex变量中的时候。 我对时间轴的理解是,要由ngFor添加的721个DOM元素的构建大约需要2.5s的时间。 我确实尝试将我的entry组件仅分解为html
  • 如何使用自动布局在UIScrollview上设置约束?(How can I use Autolayout to set constraints on my UIScrollview?)
    问题 我花了两天时间来尝试各种混合和纯自动布局方法的解决方案,以实现在自动布局之前的琐碎的scrollview设置,现在已经正式宣布了-我一定太愚蠢了。 我主要是在Storyboard中进行设置(嗯,就是这样)。 因此,这是我寻求帮助的请求。 视图树: UIView -UIView -UIView ..-UIScrollview ...-UIButton ...-UIButton ...-UIButton 这些按钮应该水平滚动(从左到右,反之亦然)。 有人可以请让我知道如何设置的约束来实现这个使用纯自动布局??? -- 我已经尝试过混合方法,如下所示: UIView - UIView - UIView ..-UIScrollview ...-UIView (contentview) ....-UIButton ....-UIButton ....-UIButton ...并按照Apple的技术说明为contentview和translatesAutoresizingMaskIntoConstraints设置设置固定的宽度和高度约束。 使用约束来设置按钮和滚动视图。 这会使scrollview滚动(是),但是可惜,它滚动得太远了! 据我所知,滚动宽度以某种方式比我在contentview中设置的宽度翻了一番。 我也尝试了纯自动布局方法,无论是否使用contentview 。
  • 具有自动布局约束的UIView动画更改(UIView animated changes with auto layout constraints)
    问题 假设我有一个类似于以下内容的项目: UIView有两个-一个叫做yellowBox ,另一个叫做redBox 。 自动布局约束指示yellowBox从超级视图的顶部起60个点,其中前,后空格为350个点(即,视图的左右两边)。 redBox具有相同的前导和尾随空间约束。 在两个0框之间存在垂直空间限制,以指示yellowBox的底部应始终直接位于redBox顶部。 当用户点击Expand Yellow Box按钮时,我希望yellowBox的高度增加,因此, redBox向下移动以继续满足垂直空间限制( yellowBox始终在redBox顶部)。 这是动画代码: - (IBAction)expandYellowBox:(id)sender { [UIView animateWithDuration:0.5 animations:^{ CGRect newFrame = self.yellowBox.frame; newFrame.size.height += 50; self.yellowBox.frame = newFrame; }]; } 但是,我一直无法正常工作。 如红色图标所示,目前约束存在问题: 这很公平,因为自动布局无法知道盒子的高度。 但是,我不知道如何以允许调整盒子大小和移动盒子的方式来解决此问题。 例如,如果我在yellowBox上指定了高度限制
  • 自动布局,屏幕旋转和UIView动画(Auto layout, screen rotation and UIView animation)
    问题 我在将UIView添加到屏幕底部并对其进行动画处理以填充整个屏幕(如果按下按钮)时遇到了问题。 该视图将上下动画,并按预期旋转。 如果我在横向时尝试设置动画,它会中断并显示错误消息: *** Assertion failure in -[UIScrollView _edgeExpressionInContainer:vertical:max:], /SourceCache/UIKit_Sim/UIKit-2380.17/NSLayoutConstraint_UIKitAdditions.m:2174 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Autolayout doesn't support crossing rotational bounds transforms with edge layout constraints, such as right, left, top, bottom. The offending view is: <UIView: 0x9199340; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = RM+BM
  • 动画化实现`drawRect`的`UIView`的`backgroundColor`(Animate `backgroundColor` of a `UIView` that implements `drawRect`)
    问题 我有一个自定义的UIView,我想为其backgroundColor属性设置动画。 这是UIView的可设置动画的属性。 这是代码: class ETTimerUIView: UIView { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } // other methods func flashBg() { UIView.animateWithDuration( 1.0, animations: { self.backgroundColor = UIColor.colorYellow() }) } override func drawRect() { // Something related to a timer I'm rendering } 此代码导致动画跳过并且颜色立即更改: self.backgroundColor = UIColor.colorYellow() // Changes immediately to yellow 如果我为alpha设置动画,则它会按预期的那样在一秒钟内从1动画到0: self.alpha = 0 // animates 在这种情况下,如何为背景颜色变化设置动画? 实现drawRect会阻止backgroundColor动画,但尚未提供答案。
  • 在 Core Animation 中为圆形箭头蒙版的长度设置动画(animating the length of circular arrow mask in Core Animation)
    问题 我使用 CAShapeLayer 和遮罩创建了一个圆形动画。 这是我的代码: - (void) maskAnimation{ animationCompletionBlock theBlock; imageView.hidden = FALSE;//Show the image view CAShapeLayer *maskLayer = [CAShapeLayer layer]; CGFloat maskHeight = imageView.layer.bounds.size.height; CGFloat maskWidth = imageView.layer.bounds.size.width; CGPoint centerPoint; centerPoint = CGPointMake( maskWidth/2, maskHeight/2); //Make the radius of our arc large enough to reach into the corners of the image view. CGFloat radius = sqrtf(maskWidth * maskWidth + maskHeight * maskHeight)/2; //Don't fill the path, but stroke it in black
  • 如何为约束更改设置动画?(How do I animate constraint changes?)
    问题 我正在使用AdBannerView更新一个旧应用,当没有广告时,它会滑出屏幕。 出现广告时,它会在屏幕上滑动。 基本的东西。 旧样式,我将帧设置在动画块中。 新样式,我对自动布局约束有一个IBOutlet ,它确定Y位置,在这种情况下,它是距父视图底部的距离,并修改常量: - (void)moveBannerOffScreen { [UIView animateWithDuration:5 animations:^{ _addBannerDistanceFromBottomConstraint.constant = -32; }]; bannerIsVisible = FALSE; } - (void)moveBannerOnScreen { [UIView animateWithDuration:5 animations:^{ _addBannerDistanceFromBottomConstraint.constant = 0; }]; bannerIsVisible = TRUE; } 横幅完全按预期移动,但没有动画。 更新:我重新观看了WWDC 12讲的“掌握自动布局的最佳实践”,其中涵盖了动画。 它讨论了如何使用CoreAnimation更新约束: 我尝试使用以下代码,但得到的结果完全相同: - (void)moveBannerOffScreen {