iOS开发常遇到的问题

一、Application windows are expected to have a root view controller at the end of application launch

这种一般是旧的工程文件在Xcode中打开缺失了一些文件和需要更新,才出现的问题。

解决方法:

在Delegate中找到:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

中加一句代码就可以了:

     [window setRootViewController:viewController];

二、collectionview打印异常log

the behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values. The relevant UICollectionViewFlowLayout instance is <KanbanCollectionViewHorizontalLayout: 0x7fa39960c8e0>, and it is attached to <UICollectionView: 0x7fa39a8ba000; frame = (0 0; 375 70); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x60800064fba0>; layer = <CALayer: 0x608000230800>; contentOffset: {0, 0}; contentSize: {187.5, 70}> collection view layout: <KanbanCollectionViewHorizontalLayout: 0x7fa39960c8e0>. Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.

这种问题出现的原因:是UICollectionView的itemSize宽度设置错了,同样,高度设置错了也会出现类似的提示,,有如下几种解决办法:

1)、不让collectionview的内容自动调整

self.automaticallyAdjustsScrollViewInsets = NO;

原因:当automaticallyAdjustsScrollViewInsets为YES时,它会找view里的scrollView,并设置scrollView的contentInset为{64, 0, 0, 0}。如果你不想让scrollView的内容自动调整,将这个属性设为NO(默认值YES)。

2)、手动调整itemSize的大小

KanbanCollectionViewHorizontalLayout *horizontalLayout = [[KanbanCollectionViewHorizontalLayout alloc] init];
[horizontalLayout setItemSize:CGSizeMake((SCREEN_WIDTH)/4, 55)]; // 这里设置item的大小是55

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(10, 0, 10, 0); // 上下间距是10
}

我设置的collectionview的高度是70,但是item的大小和上下间距加起来是75,超过了设置的高度,所以会报上面的错误,后来把上下间距改成5就解决问题了。

2、单张图片无限旋转效果

// 开启
- (void)refreshButtonStartAnimation:(UIButton *)button
{
    CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2.0];
    rotationAnimation.duration = 0.8;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = ULLONG_MAX;
    [button.imageView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}
// 关闭
- (void)refreshButtonStopAnimation:(UIButton *)button
{
    [button.imageView.layer removeAllAnimations];
}

三、Button禁止触摸事件的2种方式

大家应该知道, 有很多需求是在规定内不允许点击Button, 并且让用户知道这个按钮是不可以点击的,那我们应该这样设置:

//会改变按钮的状态,颜色会变灰
button.enabled = NO;

但是又有一个需求是既不能点击也不要改变Button颜色:

//保持按钮原来的状态,颜色不会变
button.userInteractionEnabled = NO;

四、跟xib一起走过的坑

(1) 如果在xib中有一个控件, 已经明确设置尺寸了,输出的frame也是对的, 但是显示出来的效果不一样(比如尺寸变大了), 如果是这种情况一般就是autoresizingMask自动伸缩属性在搞鬼! 解决办法如下:

//xib的awakeFromNib方法中设置UIViewAutoresizingNone进行清空
  - (void)awakeFromNib {
    self.autoresizingMask = UIViewAutoresizingNone;
}

(2)如果你的控制器的view是用xib创建的, 当你拿到view的尺寸是不准确的, 在这里我们就需要通过[UIScreen mainScreen].bounds拿到尺寸, 但是storyboard的尺寸是准确的!

五、你是用什么方法设置图片圆角?

首先你是否是这么设置的:

//cornerRadius 设置为self.iconImage图片宽度的一半(圆形图片)
    self.iconImage.layer.cornerRadius = 20;
    self.iconImage.layer.masksToBounds = YES;

或者是在xib&storyboard中点击要设置圆角的图片:

xib或者storyboard设置圆角.png

在此之后建议大家尽量不要这么设置, 因为使用图层过量会有卡顿现象, 特别是弄圆角或者阴影会很卡, 如果设置图片圆角我们一般用绘图来做:

/** 设置圆形图片(放到分类中使用) */
- (UIImage *)cutCircleImage {
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
    // 获取上下文
    CGContextRef ctr = UIGraphicsGetCurrentContext();
    // 设置圆形
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextAddEllipseInRect(ctr, rect);
    // 裁剪
    CGContextClip(ctr);
    // 将图片画上去
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}