您的位置 首页 新能源

iOS 7: 躲藏的特性和解决之道

当 iOS7 刚发布的时候,全世界的苹果开发人员都立马尝试着去编译他们的app,接着再花上数月的时间来修复任何出现的故障,甚至重做app。这样的结果

当 iOS7 刚发布的时分,全世界的苹果开发人员都立马尝试着去编译他们的app,接着再花上数月的时刻来修正任何呈现的毛病,乃至重做app。这样的成果,使得人们底子无暇去探求 iOS7 所带来的新东西。一些明显而纤细的更新,比方说[NSArray firstObject],这个办法可追溯到 iOS4 年代,现在被提为公有API,除此之外,还有许多躲藏的特性等着咱们去发掘。

滑润淡入淡出动画

我这儿要评论的并非新的弹性动画APIs 或许 UIDynamics,而是一些更纤细的东西。CALayer增加了两个新办法:allowsGroupOpacity和allowsEdgeAntialiasing。现在,组不通明度(group opacity)不再是什么新鲜的东西了。iOS会屡次运用存在于 Info.plist 中的键UIViewGroupOpacity并可在应用程序范围内启用或禁用它。关于大多数apps而言,这(译注:启用)并非所希望的,由于它会下降全体功能。在 iOS7 中,用 SDK7 所链接的程序,这项特点默许是启用的。当它被启用时,一些动画将会变得不流通,它也能够在layer层上被操控。

一个风趣的细节,假如allowsGroupOpacity启用的话,_UIBackdropView(在UIToolbar或许UIPopoverView中的布景视图)不能对其含糊进行动画处理,所以当你做一个alpha转化时,你或许会暂时禁用这项特点。由于这会下降动画体会,你能够回退到旧的办法然后在动画期间暂时启用shouldRasterize。别忘了设置恰当的rasterizationScale,不然在retina的设备上这些视图会成锯齿状。

假如你想要仿制的 Safari 显现一切选项卡时的动画,那么边际抗锯齿特点将变得十分有用。

堵塞动画

一个小但十分有用的新办法[UIView performWithoutAnimation:]。它是一个简略的封装,先查看动画当时是否启用,然后制止动画,履行块句子,最终从头启用动画。一个需求阐明的当地是,它并不会堵塞根据 CoreAnimation 的动画。因而,不必急于将你的办法调用从:

[CATransaction begin];

[CATransaction setDisableActions:YES];

view.frame = CGRectMake(…);

[CATransaction commit];

替换为:

1

2

3[UIView performWithoutAnimation:^{

view.frame = CGRectMake(…);

}];

可是,绝大多数情况下这样也能作业的很好,只需你不直接处理CALayers。

iOS7 中,我有许多代码途径(主要是 UITableViewCells)需求额定的维护,避免意外的动画,例如,假如一个弹窗的巨细调整了,那么一起显现中的表视图将由于高度的改变而加载新的cell。我一般的做法是将整个 layoutSubviews 的代码包扎到一个动画块中:

(void)layoutSubviews

{

// Otherwise the popover animation could leak into our cells on iOS 7 legacy mode.

[UIView performWithoutAnimation:^{

[super layoutSubviews];

_renderView.frame = self.bounds;

}];

}

处理长表视图

UITableView 十分快速高效,除非你开端运用tableView:heightForRowAtIndexPath:,它会开端为你表中恣意元素调用此办法,即使没有可视目标,就比方其内涵的UIScrollView仅仅去获取正确的contentSize。此前有一些变通办法,但都不好用。iOS7 中,苹果公司总算供认这一问题,并增加tableView:estimatedHeightForRowAtIndexPath:,这个办法延迟了实践翻滚时刻本钱的大部分。假如你不知道一个cell的巨细,回来UITableViewAutomaticDimension即可。

关于节头/尾(section headers/footers),现在也有相似的API了。

UISearchDisplayController

苹果的 search controller 运用了新的技巧来简化移动 search bar 到 navigation bar 的进程。启用 displaysSearchBarInNavigationBar 就能够了(除非你还要用到 scope bar,我只能说你真不幸)。我却是很喜欢这么做,但比较惋惜的是,iOS7 上的 UISearchDisplayController 形似被糟蹋的比较严重,尤其是iPad。苹果公司看上去像是没时刻处理这个问题的姿态(原文:Apple seems to have run out of time),关于显现的查找成果并不会躲藏实践的表视图。在 iOS7 之前,这并没有问题,可是现在 searchResultsTableView 有一个通明的布景色,使它看上去适当糟糕。作为一种变通办法,你能够设置不通明色或许取道于富于技巧的手法来取得你所希望的。关于这个控件会呈现各式各样的成果,当运用displaysSearchBarInNavigationBar时乃至不会展现查找表视图。

你的成果或许有所不同,但我是运用了一些手法来让displaysSearchBarInNavigationBar作业的:

(void)restoreOriginalTableView

{

if (PSPDFIsUIKitFlatMode() self.originalTableView) {

self.view = self.originalTableView;

}

}

– (UITableView *)tableView

{

return self.originalTableView ?: [super tableView];

}

– (void)searchDisplayController:(UISearchDisplayController *)controller

didShowSearchResultsTableView:(UITableView *)tableView

{

// HACK: iOS 7 requires a cruel workaround to show the search table view.

if (PSPDFIsUIKitFlatMode()) {

if (!self.originalTableView) self.originalTableView = self.tableView;

self.view = controller.searchResultsTableView;

controller.searchResultsTableView.contentInset = UIEdgeInsetsZero; // Remove 64 pixel gap

}

}

– (void)searchDisplayController:(UISearchDisplayController *)controller

didHideSearchResultsTableView:(UITableView *)tableView

{

[self restoreOriginalTableView];

}

这儿,别忘了在viewWillDisappear中调用restoreOriginalTableView,不然会发送crash。

记住这是仅有的解决办法;或许有不少急进的办法不替换视图自身,但这个问题的确应该由苹果公司来修正。(TODO: RADAR!)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/321794.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部