Mam komórki o różnej wysokości na przewijanym poziomo UICollectionView
, który wydaje się równomiernie rozmieszczać komórki pionowo pozostawiając pustą przestrzeń między komórkami i chciałbym je wyrównać w górę i mieć zmienną pustą przestrzeń u dołu każdej kolumny.Jak wyrównać w pionie UICollectionViewCells w UICollectionView?
6
A
Odpowiedz
0
Wyobrażam sobie, że używasz UICollectionViewFlowLayout do układania komórek. Nie sądzę, że możesz to zrobić za pomocą układu przepływu. Prawdopodobnie musisz napisać niestandardową podklasę UICollectionViewLayout, aby wyrównać górne krawędzie każdej komórki.
To nie jest bardzo ładne rozwiązanie, ale co z przymusem, aby wszystkie komórki miały ten sam rozmiar i skonfigurowanie ograniczeń w komórce, aby dopasować zawartość do najwyższej? Mogłoby to symulować wygląd, bez względu na podklasę UICollectionViewLayout.
12
Rozszerzyłem mój UICollectionViewFlowLayout dostarczony do mojego UICollectionView. Następujące przemilczenie działało dla mnie.
#import "TopAlignedCollectionViewFlowLayout.h"
const NSInteger kVerticalSpacing = 10;
@implementation TopAlignedCollectionViewFlowLayout
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray* attributesToReturn = [super layoutAttributesForElementsInRect:rect];
for (UICollectionViewLayoutAttributes* attributes in attributesToReturn) {
if (nil == attributes.representedElementKind) {
NSIndexPath* indexPath = attributes.indexPath;
attributes.frame = [self layoutAttributesForItemAtIndexPath:indexPath].frame;
}
}
return attributesToReturn;
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewLayoutAttributes* currentItemAttributes =
[super layoutAttributesForItemAtIndexPath:indexPath];
UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout sectionInset];
if (indexPath.item == 0) {
CGRect frame = currentItemAttributes.frame;
frame.origin.y = sectionInset.top;
currentItemAttributes.frame = frame;
return currentItemAttributes;
}
NSIndexPath* previousIndexPath = [NSIndexPath indexPathForItem:indexPath.item-1 inSection:indexPath.section];
CGRect previousFrame = [self layoutAttributesForItemAtIndexPath:previousIndexPath].frame;
CGFloat previousFrameRightPoint = previousFrame.origin.y + previousFrame.size.height + kVerticalSpacing;
CGRect currentFrame = currentItemAttributes.frame;
CGRect strecthedCurrentFrame = CGRectMake(currentFrame.origin.x,
0,
currentFrame.size.width,
self.collectionView.frame.size.height
);
if (!CGRectIntersectsRect(previousFrame, strecthedCurrentFrame)) {
CGRect frame = currentItemAttributes.frame;
frame.origin.y = frame.origin.y = sectionInset.top;
currentItemAttributes.frame = frame;
return currentItemAttributes;
}
CGRect frame = currentItemAttributes.frame;
frame.origin.y = previousFrameRightPoint;
currentItemAttributes.frame = frame;
return currentItemAttributes;
}
@end
3
ja przeniesiony to Xamarin/MonoTouch dla mojego projektu i myśli to może być przydatne
public class TopAlignedCollectionViewFlowLayout : UICollectionViewFlowLayout
{
const int VerticalSpacing = 10;
public override UICollectionViewLayoutAttributes[] LayoutAttributesForElementsInRect(RectangleF rect)
{
var attributesToReturn = base.LayoutAttributesForElementsInRect(rect);
foreach (UICollectionViewLayoutAttributes attributes in attributesToReturn)
{
if (attributes.RepresentedElementKind == null)
{
var indexPath = attributes.IndexPath;
attributes.Frame = this.LayoutAttributesForItem(indexPath).Frame;
}
}
return attributesToReturn;
}
public override UICollectionViewLayoutAttributes LayoutAttributesForItem(NSIndexPath indexPath)
{
var currentItemAttributes = base.LayoutAttributesForItem(indexPath);
UIEdgeInsets sectionInset = ((UICollectionViewFlowLayout) this.CollectionView.CollectionViewLayout).SectionInset;
if (indexPath.Item == 0)
{
var frame1 = currentItemAttributes.Frame;
frame1.Y = sectionInset.Top;
currentItemAttributes.Frame = frame1;
return currentItemAttributes;
}
var previousIndexPath = NSIndexPath.FromItemSection(indexPath.Item - 1, indexPath.Section);
var previousFrame = this.LayoutAttributesForItem(previousIndexPath).Frame;
var previousFrameRightPoint = previousFrame.Y + previousFrame.Size.Height + VerticalSpacing;
var currentFrame = currentItemAttributes.Frame;
var strecthedCurrentFrame = new RectangleF(currentFrame.X, 0, currentFrame.Size.Width, this.CollectionView.Frame.Size.Height);
if (!previousFrame.IntersectsWith(strecthedCurrentFrame))
{
var frame = currentItemAttributes.Frame;
frame.Y = frame.Y = sectionInset.Top;
currentItemAttributes.Frame = frame;
return currentItemAttributes;
}
RectangleF frame2 = currentItemAttributes.Frame;
frame2.Y = previousFrameRightPoint;
currentItemAttributes.Frame = frame2;
return currentItemAttributes;
}
}
Powiązane problemy
- 1. Animowanie wszystkich UICollectionViewCells w UICollectionView
- 2. Jak wyrównać obiekty w pionie w ASP.NET?
- 3. Jak wyrównać w pionie TextField w AS3
- 4. Jak wyrównać w pionie wiele tabel lub grafik w Lyx
- 5. Jak wyrównać w pionie element div wewnątrz komórki tabeli?
- 6. Jak wyrównać w pionie listę-listę listy z Flexbox?
- 7. Jak mogę wyrównać w pionie dwa pływające elementy div?
- 8. Jak mogę wyrównać w pionie TextBox wewnątrz StackPanel?
- 9. CSS: Jak wyrównać w pionie "etykietę" i "wejście" wewnątrz "div"?
- 10. Jak wyśrodkować komórki UICollectionView w pionie i poziomie?
- 11. Zła wydajność UIStackView w ramach UICollectionViewCells
- 12. wyrównać w pionie nie działa na inline-block
- 13. Jak wyśrodkować w pionie pozycję: element względny
- 14. Jak wyrównać obrócony tekst w środku div
- 15. Jak zmienić kierunek przewijania w UICollectionView?
- 16. Wyrównanie w pionie tekstu w UILabel
- 17. wyrównanie w pionie tekstu w wierszu NSTableView
- 18. W jaki sposób można w pionie wyrównać obrazy w obrębie listy lub elementu div?
- 19. Jak korzystać z wyrównania w pionie w bootstrapie
- 20. Jak poprawnie wyrównać obraz w pionie z tekstem wewnątrz komórki tabeli
- 21. Jak wyrównać w pionie elementy na poziomej liście ul ze zdjęciami?
- 22. Jak wyrównać wiadomości w UIAlertView?
- 23. Jak wyrównać grafikę w iTextPDF?
- 24. Jak wyrównać kolumny w fundamencie
- 25. Jak wyrównać tekst w JTextField?
- 26. Jak wyrównać tekst w pythonie?
- 27. Nawigacja nie będzie wyrównana w pionie
- 28. W jaki sposób można wyrównać w pionie tekst wielowierszowy na liście?
- 29. jak ustawić UISlider w pionie?
- 30. UICollectionView: błąd potwierdzenia w - [UICollectionView _endItemAnimations]
świetny punkt wyjścia dla innych wyprowadzeń z układu. Pracował jak urok! –
Próbowałem tego rozwiązania, ale nie działa dla mnie ze statyczną szerokością komórek i dynamiczną wysokością komórki. Kierunek przepływu jest poziomy. – shujaat
Shujaat, czy kiedykolwiek to rozgryzłeś? – tofutim