我正在使用UICollectionView&用于集合布局的流布局和类ViewView可以实现像feedly app那样的幻灯片动画或者使用app
import UIKit
class UltravisualLayout: UICollectionViewLayout {
fileprivate var contentWidth:CGFloat!
fileprivate var contentHeight:CGFloat!
fileprivate var yOffset:CGFloat = 0
var maxAlpha:CGFloat = 1
var minAlpha:CGFloat = 0
var widthOffset:CGFloat = 0
var heightOffset:CGFloat = 0
fileprivate var cache = [UICollectionViewLayoutAttributes]()
fileprivate var itemWidth:CGFloat{
return (collectionView?.bounds.width)!
}
fileprivate var itemHeight:CGFloat{
return (collectionView?.bounds.height)!
}
fileprivate var collectionViewHeight:CGFloat{
return (collectionView?.bounds.height)!
}
fileprivate var numberOfItems:Int{
return (collectionView?.numberOfItems(inSection: 0))!
}
fileprivate var dragOffset:CGFloat{
return (collectionView?.bounds.height)!
}
fileprivate var currentItemIndex:Int{
return max(0, Int(collectionView!.contentOffset.y / collectionViewHeight))
}
var nextItemBecomeCurrentPercentage:CGFloat{
return (collectionView!.contentOffset.y / (collectionViewHeight)) - CGFloat(currentItemIndex)
}
override func prepare() {
cache.removeAll(keepingCapacity: false)
yOffset = 0
for item in 0 ..< numberOfItems{
let indexPath = IndexPath(item: item, section: 0)
let attribute = UICollectionViewLayoutAttributes(forCellWith: indexPath)
attribute.zIndex = -(indexPath as NSIndexPath).row
if ((indexPath as NSIndexPath).item == currentItemIndex+1) && ((indexPath as NSIndexPath).item < numberOfItems){
attribute.alpha = minAlpha + max((maxAlpha-minAlpha) * nextItemBecomeCurrentPercentage, 0)
let width = itemWidth - widthOffset + (widthOffset * nextItemBecomeCurrentPercentage)
let height = itemHeight - heightOffset + (heightOffset * nextItemBecomeCurrentPercentage)
let deltaWidth = width/itemWidth
let deltaHeight = height/itemHeight
attribute.frame = CGRect(x: 0, y: yOffset, width: itemWidth, height: itemHeight)
attribute.transform = CGAffineTransform(scaleX: deltaWidth, y: deltaHeight)
attribute.center.y = (collectionView?.center.y)! + (collectionView?.contentOffset.y)!
attribute.center.x = (collectionView?.center.x)! + (collectionView?.contentOffset.x)!
yOffset += collectionViewHeight
}else{
attribute.frame = CGRect(x: 0, y: yOffset, width: itemWidth, height: itemHeight)
attribute.center.y = (collectionView?.center.y)! + yOffset
attribute.center.x = (collectionView?.center.x)!
yOffset += collectionViewHeight
}
cache.append(attribute)
}
}
//Return the size of ContentView
override var collectionViewContentSize : CGSize {
contentWidth = (collectionView?.bounds.width)!
contentHeight = CGFloat(numberOfItems) * (collectionView?.bounds.height)!
return CGSize(width: contentWidth, height: contentHeight)
}
//Return Attributes whose frame lies in the Visible Rect
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var layoutAttributes = [UICollectionViewLayoutAttributes]()
for attribute in cache{
if attribute.frame.intersects(rect){
layoutAttributes.append(attribute)
}
}
return layoutAttributes
}
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
let itemIndex = round(proposedContentOffset.y / (dragOffset))
let yOffset = itemIndex * (collectionView?.bounds.height)!
return CGPoint(x: 0, y: yOffset)
}
override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
// Logic that calculates the UICollectionViewLayoutAttributes of the item
// and returns the UICollectionViewLayoutAttributes
return UICollectionViewLayoutAttributes(forCellWith: indexPath)
}
}
我使用Xib创建了自定义视图
Class SmallStory
#import <UIKit/UIKit.h>
@interface SmallStory : UIView
@property (weak, nonatomic) IBOutlet UIImageView *image;
@property (weak, nonatomic) IBOutlet UILabel *title;
@property (weak, nonatomic) IBOutlet UILabel *pubDate;
@end
SmallStory.m
#import "SmallStory.h"
@interface SmallStory()
@property (nonatomic, strong) UIView *containerView;
@property (nonatomic, strong) NSMutableArray *customConstraints;
@end
@implementation SmallStory
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self customInit];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self customInit];
}
return self;
}
- (void)customInit
{
_customConstraints = [[NSMutableArray alloc] init];
UIView *view = nil;
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"SmallStory"
owner:self
options:nil];
for (id object in objects) {
if ([object isKindOfClass:[UIView class]]) {
view = object;
break;
}
}
if (view != nil) {
_containerView = view;
view.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:view];
[self setNeedsUpdateConstraints];
}
}
- (void)updateConstraints
{
[self removeConstraints:self.customConstraints];
[self.customConstraints removeAllObjects];
if (self.containerView != nil) {
UIView *view = self.containerView;
NSDictionary *views = NSDictionaryOfVariableBindings(view);
[self.customConstraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:
@"H:|[view]|" options:0 metrics:nil views:views]];
[self.customConstraints addObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:
@"V:|[view]|" options:0 metrics:nil views:views]];
[self addConstraints:self.customConstraints];
}
[super updateConstraints];
}
- (UIViewController*)getSuperViewController
{
for (UIView* next = [self superview]; next; next = next.superview)
{
UIResponder* nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]])
{
return (UIViewController*)nextResponder;
}
}
return nil;
}
@end
Xib设计看起来像
,每个小视图都被指定为SmallStory类
和故事板看起来像
当我运行应用程序时,如下所示有Autolayout警告
2017-06-06 22:18:04.044717 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.047763 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.050793 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.054839 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.058339 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.061159 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.064548 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.066582 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.068461 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; ) 将尝试通过打破约束来恢复 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-06-06 22:18:04.070615 + 0530 Jansatta [1096:258239] [LayoutConstraints]无法同时满足约束条件。 可能至少以下列表中的一个约束是您不想要的约束。 试试这个: (1)看看每个约束,并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34 ;, &#34;&#34; )
如何解决这一问题请帮助