Giter VIP home page Giter VIP logo

zycornerradius's Introduction

ZYCornerRadius
一句代码,圆角风雨无阻

A Category to make cornerRadius for UIImageView have no Offscreen-Rendered, be more efficiency 避免为UIImageView设置圆角时触发离屏渲染所带来的性能损耗,两种工作方式:Category和UIImageView子类。

##CocoaPods:

pod 'ZYCornerRadius', '~> 1.0.2'

##性能对比:
测试设备6P,屏幕中有40张尺寸为20*20的小图片,使用masksToBounds切角处理时帧率大大下降至20+,使用ZYCornerRadius时帧率保持在57+,性能接近0损耗。

内存使用对比:


##Usage:

导入头文件

#import "UIImageView+CornerRadius.h"

创建圆角半径为6的UIImageView(两种种方式):

//1
UIImageView *imageView = [[UIImageView alloc] initWithCornerRadiusAdvance:6.0f rectCornerType:UIRectCornerAllCorners];

//2
UIImageView *imageView = [[UIImageView alloc] init];
[imageView zy_cornerRadiusAdvance:6.0f rectCornerType:UIRectCornerAllCorners];

创建圆形的UIImageView(两种方式):

//1
UIImageView *imageView = [[UIImageView alloc] initWithRoundingRectImageView];

//2
UIImageView *imageView = [[UIImageView alloc] init];
[imageView zy_cornerRadiusRoundingRect];

可为UIImageView的图片附加边框:

[imageView zy_attachBorderWidth:1.f color:[UIColor redColor]];

按你的需要完成配置后,任何时候对UIImageView setImage,效果都会生效

//anytime 
imageView.image = [UIImage imageNamed:@"mac_dog"];

##iteration: 1.0.2 - 处理Xcode8带来的问题 1.0.1 - fix重大bug, 整理代码 0.9.4 - 处理多个swizzleMethod的问题 0.9.3 - 处理上版本制造的bug 0.9.2 - 处理ContentMode无效问题 0.9.1 - 处理 setImage发生在 frame计算之前(Masonry) 导致圆角无效的问题,此版本删除ZYImageView,统一使用UIImageView+CornerRadius 0.8.1 - 解决更新图片时图片内容闪动问题。 0.7.1 - 去除部分api,保持使用简洁的设计理念,加入带边框功能 0.6.1 - 解决在TableViewCell被selected后,其中UIImageView的image被重置的问题 0.5.1 - 解决SDWebImage使用placeholder为nil时发生的crash 0.4.1 - 发布第一个较完善版本
##Relation: [@liuzhiyi1992](https://github.com/liuzhiyi1992) on Github [@Blog](http://zyden.vicp.cc/) Welcome
##License: ZYCornerRadius is released under the MIT license. See LICENSE for details.

zycornerradius's People

Contributors

liuzhiyi1992 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zycornerradius's Issues

用了之后发现更耗内存了是正常现象吗?

你好,我有一个列表页面,每个Cell里面有一个UIImageView,用的Masonry布局,在模拟器上测试的。
当我用:

_logoView.layer.borderWidth = 0.5f;
_logoView.layer.borderColor = HEXCOLOR(0xdddddd).CGColor;
_logoView.layer.cornerRadius = 3;
_logoView.layer.masksToBounds = YES;

的情况下,等页面全部加载完毕,内存不再变化的时候显示的是56.3MB。
当我用:

[_logoView zy_cornerRadiusAdvance:3 rectCornerType:UIRectCornerAllCorners];
[_logoView zy_attachBorderWidth:0.5 color:HEXCOLOR(0xdddddd)];

的情况下,等页面全部加载完毕,内存不再变化的时候显示的是60.7MB。

而且每次运行跑起来对比,都是使用你的这个方法比使用cornerRadius和masksToBounds方法更消耗内存一点,这个属于正常现象吗?

IBInspectable

建议加上IBInspectable特性支持,要不然在storyboard中的imageView圆角设置太麻烦了

项目中大部分的圆角都正常 只有一个地方一直不正常

for (int i = 0; i< count; i++) {
    UIImageView *imageView = [[UIImageView alloc]initWithImage:imageList[i]];   
    [imageView zy_cornerRadiusAdvance:2.0 rectCornerType:UIRectCornerAllCorners];
    imageView.frame = CGRectMake((width + 10*ScaleScreenH)*i, 10*ScaleScreenH, width, height);
    [self addSubview:imageView];
}

这样初次加载不显示圆角 得来回加载几次才正常显示圆角 请问是什么问题呢?

圆形图片没有效果

在xcode11.4 ios13.4 圆形效果没有显示出来。[self.productImg zy_cornerRadiusAdvance:26 rectCornerType:UIRectCornerAllCorners];

[self.productImg mas_makeConstraints:^(MASConstraintMaker *make) {

    make.left.equalTo(self.bgImg.mas_left).offset(15);
    make.bottom.equalTo(self.lblDesc.mas_top).offset(-2);
    make.size.mas_equalTo(CGSizeMake(52, 52));
    
}]

UIView ?

类似的卡片效果, 在cell的contentview上再添加一层containerView, 这个view要设置圆角, 应该怎么办...

有个dealloc的crash

present一个vc出来,vc里面初始化为:

- (ZYImageView *)deviceImageView{
    if (!_deviceImageView) {
        _deviceImageView = [ZYImageView zy_roundingRectImageView];
        _deviceImageView.image = [UIImage imageNamed:@"ytb005"];
    }
    return _deviceImageView;
}

图片能够显示出来,在dismiss 的时候crash了,在ZYImageView的dealloc方法挂了

- (void)dealloc {
    if (_hadAddObserver) {
        [self removeObserver:self forKeyPath:@"image"];
    }
}

console输出如下

Trapped uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <ZYImageView 0x12cf74510> for the key path "image" from <ZYImageView 0x12cf74510> because it is not registered as an observer.' 
(
    0   CoreFoundation                      0x00000001833aee50 <redacted> + 148
    1   libobjc.A.dylib                     0x0000000182a13f80 objc_exception_throw + 56
    2   CoreFoundation                      0x00000001833aed80 <redacted> + 0
    3   Foundation                          0x0000000183cc5138 <redacted> + 496
    4   Foundation                          0x0000000183cc4c14 <redacted> + 92
    5   Client                              0x0000000100352628 -[UIImageView(CornerRadius) dealloc] + 96
    6   Client                              0x0000000100353e98 -[ZYImageView dealloc] + 144
    7   Foundation                          0x0000000183d02c80 <redacted> + 92
    8   libobjc.A.dylib                     0x0000000182a2dae8 <redacted> + 508
    9   CoreFoundation                      0x000000018328cabc _CFAutoreleasePoolPop + 28
    10  CoreFoundation                      0x0000000183362c48 <redacted> + 1636
    11  CoreFoundation                      0x000000018328cd10 CFRunLoopRunSpecific + 384
    12  GraphicsServices                    0x0000000184b74088 GSEventRunModal + 180
    13  UIKit                               0x0000000188561f70 UIApplicationMain + 204
    14  Client                              0x0000000100171750 main + 124
    15  libdyld.dylib                       0x0000000182e2a8b8 <redacted> + 4
)
2016-04-11 14:52:52.001 Client[6827:2935922] *** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <ZYImageView 0x12cf74510> for the key path "image" from <ZYImageView 0x12cf74510> because it is not registered as an observer.'
*** First throw call stack:
(0x1833aee38 0x182a13f80 0x1833aed80 0x183cc5138 0x183cc4c14 0x100352628 0x100353e98 0x183d02c80 0x182a2dae8 0x18328cabc 0x183362c48 0x18328cd10 0x184b74088 0x188561f70 0x100171750 0x182e2a8b8)

frame变化

首先非常感谢提供这个优秀的开源库。
我使用cocoapods导入1.0.2版本库,Xcode Version 8.3.2 (8E2002),真机iPhone 6s 10.3.3 (14G60)。
对xib中的imageView拖出outlet,然后调用[self.imageView zy_cornerRadiusAdvance:5.0 rectCornerType:UIRectCornerAllCorners];,调用前和调用后,self.imageView的Frame发生了变化,由(origin = (x = 5, y = 5), size = (width = 48.5, height = 48.5))变化为(origin = (x = -4.5, y = -4.5), size = (width = 67.5, height = 67.5)),我认为这是一个问题,谢谢。

偶尔会崩溃

.m 106行 objc_setAssociatedObject(processedImage, &kProcessedImage, @(1), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
崩溃的时候processedImage为nil
错误为EXC_BAD_ACCESS

UITableViewCell、UICollectionViewCell中使用,卡顿更严重了

RT,使用传统方式设置圆角,iPhone 7帧率约57fps,使用这个类库设置圆角,帧率直接降低至50fps以下,画面产生明显卡顿。

仔细查看代码,发现通过对image的观察者实现替换操作,但是,这个image的裁剪操作是在当前线程完成的,也就是说设置image是在主线程完成的操作,这个裁剪也是主线程完成的,我不知道作者是基于什么考虑在主线程做这个操作的,并且这个操作并没有缓存,也就是说,每次设置都要裁剪。这导致相当严重的性能问题。

卡顿

设置了 几十个 VIEW 在 控制器view 上 ,不需要滚动 ,但要切圆角,push到下一个控制器 的时候回卡顿,楼主能赐教不。

关于layoutsubviews触发的疑问

你好,我看到你在博客里写了原理。当一个UI image view设置frame时才会触发layoutsubviews方法或者swizzingmethod改变的方法。当使用sdwebimage时,首先设置一个placeholder图片,然后走了那个方法。过了一会儿网络请求的图片被赋给了image view,此时会触发layoutsubviews方法吗?

collectionView第一屏显示问题

第一次加载出来的时候,第一屏的图片大小偏小于ImageView本身,两边留有空白,而且圆角也存在问题,只有左上角有圆角,滚动之后就好了,请问这是什么问题? @liuzhiyi1992

内存无法释放

在列表中的UIImageView使用此库,退出列表无法释放内存。列表和cell都已经释放了,走了dealloc方法的,检查发现就是这个库引起的,因为不使用此方法内存可以正常释放,使用了就不行:[_headImgView zy_cornerRadiusAdvance:6 rectCornerType:UIRectCornerAllCorners]
使用此方法:原始内存45M,进入列表87兆,退出列表依然82M。并且重复进入和退出列表页面,内存持续涨到几百兆。
屏蔽此方法:原始内存44M,进入列表52兆,退出列表47M。重复进入和退出列表页面,内存不会持续增长。始终50M左右。

图片闪动

tableview 刷新的时候会有闪动情况,怎么处理?

在设置圆角的界面返回上一层,偶尔会crash

crash reason : An instance 0x7fc32379a330 of class UIImageView was deallocated while key value observers were still registered with it. Current observation info: <NSKeyValueObservationInfo 0x7fc3235c6330> (
<NSKeyValueObservance 0x7fc3235b0910: Observer: 0x7fc32379a330, Key path: image, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x7fc323794190>
)
有时会crash掉,貌似是没有是没有释放掉...我的项目环境是Xcode7.3.1,iOS8.0

当一个cell中有多个UIImageView 的时候,有问题

当一个cell中有多个UIImageView 的时候,我对UIImageView进行圆角和边框设置的时候,有问题,图片显示不出来 ,但是我对每个图片设置了不同的tag的时候,图片都显示正常。算是一个小坑。。。。楼主有空解决下呗,这个还是挺好用的。

可以不用方法交换吗?

你好,源码中使用了方法交换:
[self.class swizzleMethod:@selector(layoutSubviews) anotherMethod:@selector(zy_LayoutSubviews)];

可以不使用方法交换实现吗?毕竟方法交换太危险,应当尽量避免使用。

设置圆角图片闪退

[self.headerImg sd_setImageWithURL:[NSURL URLWithString:customer.headimg] placeholderImage:[UIImage imageNamed:@"icon_lxr"]];
会有闪退的现象。

Bug

用提供的创建一个圆形UIImageView的方法创建UIImageView,贴上图片并设置隐藏,当在其他地方取消隐藏的时候,不能加载设置的图片。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.