You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The modern way to build app interfaces is Auto Layout based on building constraints connecting views. Let's suppose we have some simple screen with one label at the top and calendar that occupies the remaining part of screen. KVKCalendarView has here the red background.
import KVKCalendar
import EventKit
import Foundation
class ViewController: UIViewController {
var events = [Event]()
private var label = {
let label = UILabel()
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "Label with a very very very very very very very very very very very very very very very very very very long text"
return label
}()
private lazy var calendarView: KVKCalendarView = {
var style = Style()
style.defaultType = .week
let calendar = KVKCalendarView(frame: CGRect.zero, style: style)
calendar.dataSource = self
calendar.backgroundColor = .red
return calendar
}()
private var calendarContainerView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(label)
view.addSubview(calendarContainerView)
debugPrint(view.safeAreaInsets)
label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
label.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
label.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
calendarContainerView.topAnchor.constraint(equalTo: label.bottomAnchor).isActive = true
calendarContainerView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
calendarContainerView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
calendarContainerView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
calendarContainerView.addSubview(calendarView)
createEvents { (events) in
self.events = events
self.calendarView.reloadData()
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
calendarView.reloadFrame(calendarContainerView.frame)
}
func createEvents(completion: ([Event]) -> Void) {
let formatter = DateFormatter()
formatter.dateFormat = "dd.MM.yyyy HH:mm"
var firstEvent = Event(ID: "1")
firstEvent.start = formatter.date(from: "31.10.2024 10:30")!
firstEvent.end = formatter.date(from: "31.10.2024 11:00")!
firstEvent.color = Event.Color(.red)
var secondEvent = Event(ID: "2")
secondEvent.start = formatter.date(from: "01.11.2024 14:00")!
secondEvent.end = formatter.date(from: "01.11.2024 15:30")!
secondEvent.color = Event.Color(.green)
completion([
firstEvent,
secondEvent
])
}
}
extension ViewController: CalendarDataSource {
func eventsForCalendar(systemEvents: [EKEvent]) -> [KVKCalendar.Event] {
return events
}
}
This screen is displayed so (obviously it's incorrect):
If we move reloadFrame call to viewWillLayoutSubviews as written in docs, we'll get this:
Similar bugs can be reproduced even without Auto layout, it's enough to pass to reloadFrame any frame with origin different from zero (yes, it can happen, when there are another views in the controller and calendar isn't at the top).
Please elaborate how can we achieve the correct positioning without big empty spaces?
The text was updated successfully, but these errors were encountered:
The modern way to build app interfaces is Auto Layout based on building constraints connecting views. Let's suppose we have some simple screen with one label at the top and calendar that occupies the remaining part of screen. KVKCalendarView has here the red background.
This screen is displayed so (obviously it's incorrect):
![image](https://private-user-images.githubusercontent.com/11074431/382288093-30934bcd-afd1-4cb4-93a4-a05f8effecee.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTA5MDksIm5iZiI6MTczOTE5MDYwOSwicGF0aCI6Ii8xMTA3NDQzMS8zODIyODgwOTMtMzA5MzRiY2QtYWZkMS00Y2I0LTkzYTQtYTA1ZjhlZmZlY2VlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDEyMzAwOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVjNzVhNzU3NDI1N2JmODJkM2M3MzNkMzRhZWRmOWUyODY0OWYxN2Q4MzUzYjNhNzRjMzE2NDhmMjYzNWNhMmEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3N4U2bPT_FG7lIODL47LQv7N-e2q_61e7p1ZDR9PXW4)
If we move
![image](https://private-user-images.githubusercontent.com/11074431/382288450-adabf75f-6c57-48e3-af98-2980841f19ac.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkxOTA5MDksIm5iZiI6MTczOTE5MDYwOSwicGF0aCI6Ii8xMTA3NDQzMS8zODIyODg0NTAtYWRhYmY3NWYtNmM1Ny00OGUzLWFmOTgtMjk4MDg0MWYxOWFjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDEyMzAwOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ5ZjAxNGQyNTI1NzQwZTllMTFjMGE3YjRjOGY4NGFlMWFjZWMyZGE4MTAyNzc5Yzk4ZGYwMTBhZWZjMTYxZTQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.6AGVSTiI-QVzAQP12pHZ6KRJ4s_092juIpXC28f_qfs)
reloadFrame
call toviewWillLayoutSubviews
as written in docs, we'll get this:Similar bugs can be reproduced even without Auto layout, it's enough to pass to
reloadFrame
any frame with origin different from zero (yes, it can happen, when there are another views in the controller and calendar isn't at the top).Please elaborate how can we achieve the correct positioning without big empty spaces?
The text was updated successfully, but these errors were encountered: