UIViewController维护对UICollectionView的引用.控制器应使用UICollectionViewDelegateFlowLayout修改内置流布局.
将视图的数据源设置为self非常容易:
MyViewController.m
- (void)viewDidLoad
{
self.collectionView.dataSource = self;
}
Run Code Online (Sandbox Code Playgroud)
但是如何将控制器设置为视图的委托流布局?
- (void)viewDidLoad
{
self.collectionView.dataSource= self;
// self.collectionView.??? = self;
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
- (void)viewDidLoad
{
self.collectionView.dataSource= self;
self.collectionView.collectionViewLayout = self;
}
Run Code Online (Sandbox Code Playgroud)
但我得到错误:"不兼容的指针类型分配......".
集合头文件如下所示:
MyViewController.h
@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
Run Code Online (Sandbox Code Playgroud) 我使用UICollectionView(flowlayout)来构建一个简单的布局.每个单元格的宽度设置为使用的屏幕宽度self.view.frame.width
但是当我旋转设备时,单元格不会更新.
我找到了一个函数,在调整方向时调用它:
override func willRotateToInterfaceOrientation(toInterfaceOrientation:
UIInterfaceOrientation, duration: NSTimeInterval) {
//code
}
Run Code Online (Sandbox Code Playgroud)
但我无法找到更新UICollectionView布局的方法
主要代码在这里:
class ViewController: UIViewController , UICollectionViewDelegate , UICollectionViewDataSource , UICollectionViewDelegateFlowLayout{
@IBOutlet weak var myCollection: UICollectionView!
var numOfItemsInSecOne: Int!
override func viewDidLoad() {
super.viewDidLoad()
numOfItemsInSecOne = 8
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
//print("orientation Changed")
}
func …Run Code Online (Sandbox Code Playgroud) 我有一个UICollectionViewController,它使用标准UICollectionViewFlowLayout来显示单个垂直的单元格列.我试图在点击单元格时在单元格上创建展开/折叠动画.我使用以下代码来完成此任务:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath (NSIndexPath *)indexPath
{
[self.feedManager setCurrentlySelectedCellIndex:indexPath.item];
[self.collectionView performBatchUpdates:nil completion:nil];
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
//Return the size of each cell to draw
CGSize cellSize = (CGSize) { .width = 320, .height = [self.feedManager heightForCellAtIndexPath:indexPath] };
return cellSize;
}
Run Code Online (Sandbox Code Playgroud)
我的管理对象上的'selectedCellIndex'属性告诉数据模型返回heightForCellAtIndexpath内的展开或折叠大小:
[self.collectionView performBatchUpdates:nil completion:nil];
Run Code Online (Sandbox Code Playgroud)
然后该performBatchUpdates:completiong:方法很好地动画了这个尺寸变化.然而!当动画发生时,扩展单元格可能会导致屏幕底部的部分可见单元格离开屏幕.
如果是这种情况,我随后会折叠此单元格,现在关闭屏幕单元格将在没有动画的情况下捕捉到其旧位置,而所有其他可见单元格将根据需要进行动画处理.我的直觉说这是正确的行为,因为在执行折叠动画时单元格不在屏幕上,并且没有包含在动画渲染过程中.我的问题变成了,我该如何防止这种情况发生?
我宁愿所有细胞一起动画,无论它们是否在屏幕外.有什么想法吗?
我刚刚将我的应用程序从Qt 4.8.4移植到Qt 5.2.1.我在Qt文档FlowLayout中的FlowLayout示例代码中提供了类的问题.
我有QMainWindow一个QDockWidget停靠在中央部件的底部.该QDockWidget有FlowLayout几个子部件.在Qt 4.8中,这就像一个魅力,儿童小工具的大小符合标准尺寸DockWidget.但是,在Qt 5.2中,DockWidget尝试将其大小增加到最大值(从中央小部件取代).更改其布局可防止此不良行为.但当然,我FlowLayout是故意使用的.
为了说明这个问题,我创建了一个最小的例子:
构造函数DockWidget:
QGroupBox *generalBox = new QGroupBox("");
generalBoxLayout = new FlowLayout;
generalBox->setLayout(generalBoxLayout);
for(int i=0; i<10; ++i)
{
QPushButton *button = new QPushButton("Test", this);
button->setMinimumWidth(100);
button->setMinimumHeight(100);
generalBoxLayout->addWidget(button);
}
this->setWidget(generalBox);
Run Code Online (Sandbox Code Playgroud)
有人知道问题是什么以及我如何解决它?
编辑 我创建了一个新的最小工作示例,遗憾的是无法重现Qt 4.8和Qt 5.2之间的差异.同样的问题出现在Qt 4.8中,所以我仍然想在这里介绍它:
显示底部停靠的dockwidget占据整个垂直空间的初始视图:

使用鼠标调整dockwidget的大小后查看

使用鼠标调整主窗口大小后查看

这些屏幕截图显示,在手动更改dockwidget的大小后,dockwidgets的行为与预期一致.但是,在初始化时,窗口小部件从中央窗口小部件获取所有可用空间,这是不希望的.
有人知道解决方案/解决方法吗?
我正在制作一个GUI,它在一个大型JPanel上方显示三个JToolBars.这些工具栏总体上非常大,所以我使用FlowLayout使它们在到达JFrame边界时换行到下一行.问题是,当它们换行到下一行时,它们会被下面的JPanel隐藏起来.我希望我可以强制包含工具栏的JPanel增长到足以显示所有工具栏.
有没有办法做到这一点?或者是否有其他方法可以使这些工具栏可见?
我有带有水平滚动方向的Flow布局的ios UICollectionView.在这种情况下,典型的标题位置位于单元格的左侧.
我想在节细胞的顶部制作标题
你知道我怎么能这样做吗?
当浏览器窗口变窄时,如何在文本换行时将单选按钮()或复选框[]及其标签保持在一起,这样我们就不会得到这样的结果:
[ ] pepperoni [ ] anchovies [ ] mushrooms [ ]
olives
Run Code Online (Sandbox Code Playgroud)
编辑以回应nowrap建议.谢谢你的建议.差不多了.它适用于Chrome,FF和Opera,但不适用于IE9.当页面CSS label {white-space: nowrap}和标记是:
<td>
<div>
<label>
<input type="radio" name="pizza" checked="true"
id="pepperoni" value="pepperoni" />pepperoni </label>
<label>
<input type="radio" name="pizza"
id="anchovies" value="anchovies" />anchovies </label>
<label>
<input type="radio" name="pizza"
id="mushrooms" value="mushrooms" />mushrooms </label>
<label>
<input type="radio" name="pizza"
id="olives" value="olives" />olives </label>
</div>
</td>
Run Code Online (Sandbox Code Playgroud)
在IE9中 TD变为固定宽度; 当浏览器窗口变窄时,TD不会收缩,我明白了:
( ] pepperoni ( ) anchovies ( ) mushrooms ( ) olives
Run Code Online (Sandbox Code Playgroud)
当我需要这个时:
( ) pepperoni ( ) anchovies
( …Run Code Online (Sandbox Code Playgroud) 我正在构建一个像这样的布局的挑战:
我的第一个见解是使用带有适配器的RecyclerView,该适配器可以处理每个项目并使其布局膨胀.
到目前为止,还不是那么好.
到目前为止我有这个布局:
我可以感觉到我几乎就在那里,但是真的......我花了一个星期思考如何让它变得更好,或者就像UI提出的那样.
我的一些尝试是
伙计们,我不是在这里寻找一些已经完成的代码安静或者有人来完成我的工作.其实我正在寻找隧道尽头的灯光.
android layout-manager flowlayout gridlayoutmanager android-recyclerview
我有一个UICollectionView我已经设置,一切正常(选择,标题等),但是,我想在某些情况下更改滚动方向.
简而言之,如果我进入故事板并更改scrollDirection它工作正常,但我想以编程方式进行!
我试图用类似的东西直接改变集合视图的滚动方向
[myCollectionView setScrollDirection:....and so on.......
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我找不到scrollDirection或类似的东西.
我也尝试设置流布局,但我确信我做错了(即尝试将ViewLayout设置为FlowLayout).
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
[myCollectionView setCollectionViewLayout:flowLayout];
Run Code Online (Sandbox Code Playgroud)
这会导致很多Constraint问题崩溃,我怀疑我需要使用flowLayout做更多的工作(从我发现它现在有点高于我).
还应该注意的是,我使用的是自定义单元格,页眉和页脚.
简而言之,是否有一种简单的方法可以做到这一点?或者有没有人知道一个好的Flow Layout教程?
编辑
我这样设置了集合视图;
[myCollectionView setDataSource:self];
[myCollectionView setDelegate:self];
Run Code Online (Sandbox Code Playgroud)
我实现这些委托方法,一切正常
viewForSupplementaryElementOfKind
numberOfSectionsInCollectionView
numberOfItemsInSection
cellForItemAtIndexPath
didSelectItemAtIndexPath
Run Code Online (Sandbox Code Playgroud)
我已经将DataSource和Delegate添加到.h以及FlowLayout委托但是我不确定我应该为后者添加什么.
大多数视觉布局都是在Story Board中完成的,有一些东西,比如字体,大小和颜色,我以编程方式进行.
另一个编辑
当我尝试更改FlowLayout时,这是错误,当我尝试使布局无效时,我也会得到这个错误.
无法同时满足约束.可能至少下列列表中的一个约束是您不想要的约束.试试这个:(1)看看每个约束并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它.(注意:如果您看到您不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints)
"<NSAutoresizingMaskLayoutConstraint:0x89967f0 h=--& v=--& V:[menuCell:0x8991700(50)]>",
"<NSLayoutConstraint:0x8991200 menuCell:0x8991700.bottom == UILabel:0x8992be0.bottom + 100>",
"<NSLayoutConstraint:0x898fd50 UILabel:0x8992be0.top == menuCell:0x8991700.top + 3>"
Run Code Online (Sandbox Code Playgroud)
将尝试通过打破约束来恢复
打破objc_exception_throw以在调试器中捕获它.在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助.
我有一个带有UICollectionViewFlowLayout的collectionview,我在其中放了10个项目.它们有不同的尺寸:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row<6) {
CGSize retval = CGSizeMake(100, 100);
return retval;
}
CGSize retval = CGSizeMake(200, 130);
return retval;
}
Run Code Online (Sandbox Code Playgroud)
它的布局如下:前6个单元看起来很好,7-9是正确的,但最后一个不是中心对齐的,

任何人都可以向我解释一下吗?
和怨恨的日子我正在玩收集布局,但仍然感到困惑的选择flowlayout和自定义布局.关于这个的任何原则?
很多thx提前.
flowlayout ×10
ios ×5
android ×1
animation ×1
checkbox ×1
cocoa-touch ×1
css ×1
header ×1
html ×1
java ×1
jtoolbar ×1
qdockwidget ×1
qt ×1
qt4 ×1
qt5 ×1
radio-button ×1
swift ×1
swing ×1
xcode ×1