Reputation: 39081
I have a tableview
with custom cells which are built from storyboard
with an identifier using AutoLayout
.
One of the subviews
needs to be round (layer.cornerRadius = width/2)
, it is a square in the beginning.
I have tried in layoutSubviews()
but it seems to be called before AutoLayout
changes its size... same thing for didMoveToSuperview()
Where is the proper function to update things like this to my subviews after AutoLayout
has changed their sizes?
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell_small") as! Cell
...
return cell
}
// In Cell
override func layoutSubviews() {
rankLabel.layer.cornerRadius = rankLabel.bounds.width/2
rankLabel.layer.masksToBounds = true
}
override func didMoveToSuperview() {
rankLabel.layer.cornerRadius = rankLabel.bounds.width/2
rankLabel.layer.masksToBounds = true
}
Result:
Upvotes: 9
Views: 3751
Reputation: 467
I had the same issue with my imageview so i resolved it by sub-classing UIImageView.
@interface MyImageView : UIImageView
@end
@implementation MyImageView
-(void)layoutSubviews
{
[super layoutSubviews];
self.layer.cornerRadius = self.bounds.size.width / 2.0;
}
@end
Upvotes: 1
Reputation: 61
1.Create a custom class of UIView/category
#import <UIKit/UIKit.h>
@interface RoundView : UIView
@end
#import "RoundView.h"
2.Add layoutSubviews method and set corner radius.
@implementation RoundView
-(void)layoutSubviews{
[super layoutSubviews];
self.layer.cornerRadius = self.bounds.size.width/2;
self.layer.masksToBounds = true;
}
3.Make your UIView as a subclass of RoundView and run the application, you can see circle view.
Upvotes: 3
Reputation: 39081
What I ended up doing was making a class called RoundView
class RoundView:UIView {
override func layoutSubviews() {
super.layoutSubviews()
self.layer.cornerRadius = self.bounds.width/2
self.layer.masksToBounds = true
}
}
And then I apply it to every view I need to be round. So in Storyboard I add RoundView
to Custom Class
.
What was happening was that if you look inside the source of the storyboard (XML) every view had the size of the whole screen, you can look inside your own SB code. So by trying to add a corner radius equal to the width/2
inside its parent layoutSubviews()
that subview hasn't got its frame set correctly. So the corner radius got the value of 320/2
instead of 50/2
, thats why it got misshaped.
Upvotes: 15
Reputation: 6040
It's strange, I make my round cells just by using your code. (and I also use auto layout).
The only difference is, I use .frame
and not .bounds
(divided by 2). Have you tried that?
Otherwise you can use a custom cell and in the -awakeFromNib
set rounding the same way, so you don't have to do it in each cell.
Upvotes: 0
Reputation: 4437
Try subclassing UITableViewCell like this,
@interface RoundingCell : UITableViewCell
@property (nonatomic,weak) IBOutlet UILabel * someLabel;
@end
@implementation RoundingCell
-(void)layoutSubviews
{
[super layoutSubviews];
self.someLabel.layer.cornerRadius = CGRectGetHeight(self.someLabel.bounds)/2;
self.someLabel.layer.masksToBounds = YES;
}
@end
And Use this as the class of the desired cell, along with IBOutlet connections.
Upvotes: 1
Reputation: 4641
You have two options:
like following
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
and change it inside there. To access the cell you call
[(YourCell *)cell view]....
Upvotes: -1